Ich habe eine Eingabe, die eine ng-Wiederholungsliste bei Änderung filtert. Die Wiederholung enthält viele Daten und dauert einige Sekunden, um alles zu filtern. Ich möchte eine Verzögerung von 0,5 Sekunden, bevor ich mit dem Filtervorgang beginne. Was ist der richtige Weg im Winkel, um diese Verzögerung zu erzeugen?
Eingang
<input ng-model="xyz" ng-change="FilterByName()" />
Wiederholen
<div ng-repeat"foo in bar">
<p>{{foo.bar}}</p>
</div>
Filterfunktion
$scope.FilterByName = function () {
//Filtering Stuff Here
});
Vielen Dank
$timeout
für 500ms.$scope.FilterByName = function () { $timeout(_filterByName , 500)
$timeout.cancel(timeoutpromise)
wenn eine Zeitüberschreitung ausgeführt wird und eine weitere Änderung ausgelöst wird.Antworten:
AngularJS 1.3+
Seit AngularJS 1.3 können Sie die
debounce
Eigenschaft nutzenngModelOptions
, um dies sehr einfach ohne Verwendung zu erreichen$timeout
überhaupt zu verwenden. Hier ist ein Beispiel:HTML:
JS:
-- ODER --
Überprüfen Sie die Geige
Vor AngularJS 1.3
Sie müssen $ timeout verwenden, um eine Verzögerung hinzuzufügen, und wahrscheinlich können Sie mit $ timeout.cancel (previoustimeout) jedes vorherige Timeout abbrechen und das neue ausführen (dies verhindert, dass die Filterung innerhalb von a mehrmals hintereinander ausgeführt wird Zeitintervall)
Hier ist ein Beispiel:
quelle
ng-model-options
nur in Angular v1.3 (und der Debounce-Eigenschaft in Beta.8 ) hinzugefügt wurde . Diejenigen, die noch eine ältere Version von Angular verwenden müssen, müssen auf andere Lösungen wie die von PSL oder ein externes Modul wie ng-debounce zurückgreifen .Sie könnten verwenden
$timeout
, um eine Verzögerung hinzuzufügen und wahrscheinlich mit der Verwendung von$timeout.cancel(previoustimeout)
Option eine frühere Zeitüberschreitung abbrechen und die neue ausführen (dies verhindert, dass die Filterung innerhalb eines Zeitintervalls mehrmals hintereinander ausgeführt wird).Beispiel:-
Plnkr
quelle
ng-change
wenn ich das Modell nicht entprellen möchte.Ich weiß, dass die Frage zu alt ist. Aber ich möchte immer noch einen schnelleren Weg bieten, um dies durch Entprellen zu erreichen .
So kann der Code geschrieben werden als
Bei der Entprellung wird die Zahl in Millisekunden angegeben.
quelle
oder Sie können die Direktive 'typeahead-wait-ms = "1000"' von angle -ui verwenden
quelle