Eckig und entprellen
In AngularJS kann ich debounce-ein Modell mit ng-model-options.
ng-model-options="{ debounce: 1000 }"
Wie kann ich die debounce-Modell in Eckig? Ich habe versucht, zu suchen für debounce in die docs, aber ich konnte nichts finden.
https://angular.io/search/#stq=debounce&stp=1
Eine Lösung wäre, zu schreiben, meine eigenen debounce-Funktion, zum Beispiel:
import {Component, Template, bootstrap} from 'angular2/angular2';
//Annotation section
@Component({
selector: 'my-app'
})
@Template({
url: 'app.html'
})
//Component controller
class MyAppComponent {
constructor() {
this.firstName = 'Name';
}
changed($event, el){
console.log("changes", this.name, el.value);
this.name = el.value;
}
firstNameChanged($event, first){
if (this.timeoutId) window.clearTimeout(this.timeoutID);
this.timeoutID = window.setTimeout(() => {
this.firstName = first.value;
}, 250)
}
}
bootstrap(MyAppComponent);
Und meine html -
<input type=text [value]="firstName" #first (keyup)="firstNameChanged($event, first)">
Aber ich bin auf der Suche nach einem build-in-Funktion, ist es eine in Eckige?
InformationsquelleAutor der Frage koningdavid | 2015-08-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aktualisiert für RC.5
Mit Winkel-2 können wir debounce mit RxJS Betreiber
debounceTime()
auf ein Formular-SteuerelementvalueChanges
beobachten:Plunker
Den obigen code enthält auch ein Beispiel, wie Gas-Fenster resize-Ereignisse, wie gebeten, durch @albanx in einem Kommentar unten.
Obwohl der obige code ist wahrscheinlich die Winkel-Weg, es zu tun, es ist nicht effizient. Jeder Tastendruck und jede resize-Ereignis aus, obwohl Sie entprellten und gedrosselt, Ergebnisse im change detection ausgeführt. In anderen Worten, entprellung und die Drosselung nicht beeinflussen, wie oft ändern Sie die Erkennung läuft. (Ich fand eine GitHub Kommentar von Tobias Bosch, bestätigt dies.) Sie können dies sehen, wenn Sie führen Sie die plunker und sehen Sie, wie viele Male
ngDoCheck()
aufgerufen wird, wenn Sie geben in das Eingabefeld ein, oder ändern Sie die Größe der Fenster. (Verwenden Sie die Blaue "x" - Taste, um führen Sie die plunker in einem separaten Fenster zu sehen, die auf resize-Ereignisse.)Ein effizienteres Verfahren ist das erstellen RxJS Observablen selbst von den Ereignissen, die außerhalb der Eckigen "zone". Auf diese Weise, ändern Sie die Erkennung nicht jedes mal aufgerufen, wenn ein Ereignis ausgelöst wird. Dann, in Ihrem subscribe callback-Methoden, manuell trigger-change-detection – D. H., die du kontrollierst, wenn die änderungserkennung ist genannt:
Plunker
Benutze ich
ngAfterViewInit()
stattngOnInit()
um sicherzustellen, dassinputElRef
definiert ist.detectChanges()
ausgeführt werden (change detection) auf dieser Komponente und Ihre Kinder. Wenn Sie lieber laufen (change detection) von der root-Komponente (D. H., führen Sie eine vollständige change detection-check), dann verwenden SieApplicationRef.tick()
statt. (Ich habe einen AufrufApplicationRef.tick()
in den Kommentaren in der plunker.) Beachten Sie, dass der Aufruftick()
verursachenngDoCheck()
genannt zu werden.InformationsquelleAutor der Antwort Mark Rajcok
Wenn Sie nicht wollen, befassen sich mit
@angular/forms
können Sie verwenden Sie einfach einen RxJSBetreff
mit ändern der Bindungen.view.component.html
anzeigen.Komponente.ts -
Dieser löst change detection). Für einen Weg, der nicht auslösen (change detection), check-out Mark ' s Antwort.
InformationsquelleAutor der Antwort 0xcaff
Nicht direkt zugänglich sind, wie in angular1 aber Sie können ganz einfach spielen mit NgFormControl und RxJS observablen:
Diesem blog-post erklärt es ganz deutlich:
http://blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html
Hier ist es für eine AutoVervollständigen-aber es funktioniert in allen Szenarien.
InformationsquelleAutor der Antwort bertrandg
Könnte es umgesetzt werden, wie die Richtlinie
verwenden Sie es wie
InformationsquelleAutor der Antwort Oleg Polezky
Für jeden, lodash, es ist extrem einfach zu debounce jede Funktion:
dann nur werfen Sie etwas wie dies in Ihrer Vorlage ein:
InformationsquelleAutor der Antwort br4d
Können Sie erstellen eine RxJS Beobachtbardie tut, was Sie möchten.
view.component.html
anzeigen.Komponente.ts -
InformationsquelleAutor der Antwort Matthias
Ich löste dies durch das schreiben einer debounce-Dekorateur. Das beschriebene problem konnte gelöst werden, indem die @debounceAccessor das Eigentum der set-accessor.
Hab ich auch geliefert, eine zusätzliche debounce-decorator für die Methoden, die nützlich sein können für andere Anlässe.
Dies macht es sehr einfach zu debounce eine Eigenschaft oder eine Methode. Der parameter ist die Anzahl der Millisekunden, die die debounce dauern sollte, 100 ms im Beispiel unten.
Und hier ist der code für die Dekorateure:
Ich einen zusätzlichen parameter für die Methode Dekorator, welche das auslösen der Methode, NACH der debounce delay. Ich habe, so könnte ich zum Beispiel verwenden, wenn gepaart mit mouseover oder resize-Ereignisse, wo ich wollte, dass die Erfassung auftreten, an das Ende der event-stream. In diesem Fall ist das Verfahren jedoch nicht einen Wert zurückgeben.
InformationsquelleAutor der Antwort Fredrik_Macrobond
Erstellen wir ein [debounce] Richtlinie überschreibt ngModel Standard viewToModelUpdate-Funktion mit einer leeren.
Richtlinie Code
Wie es zu benutzen
InformationsquelleAutor der Antwort BebbaPig
Einfache Lösung wäre eine Richtlinie, die Sie anwenden können, um jede Kontrolle.
Verwendung wäre
InformationsquelleAutor der Antwort Ashg
Verbrachte Stunden auf dieses, hoffentlich kann ich sparen, jemand anders einige Zeit. Für mich die folgende Vorgehensweise, um mit
debounce
auf eine Steuerung ist intuitiver und einfacher zu verstehen für mich. Es basiert auf dem Winkel.io-docs-Lösung für autocomplete aber mit der Fähigkeit für mich das abfangen der Anrufe, ohne dabei auf das binden der Daten an den DOM.Plunker
Einer use-case-Szenario für diese könnte prüfen, einen Benutzernamen nach der Eingabe zu sehen, ob jemand schon gewonnen hat, dann Warnung der Benutzer.
Hinweis: vergessen Sie nicht,
(blur)="function(something.value)
vielleicht mehr Sinn machen für Sie je nach Ihren Bedürfnissen.InformationsquelleAutor der Antwort Helzgate
Dies ist die beste Lösung, die ich gefunden habe bis jetzt. Updates der
ngModel
aufblur
unddebounce
als entlehnt aus https://stackoverflow.com/a/47823960/3955513
Dann in HTML:
Auf
blur
das Modell ist explizit aktualisiert mit plain javascript.Beispiel hier: https://stackblitz.com/edit/ng2-debounce-working
InformationsquelleAutor der Antwort Shyamal Parikh
Für Reaktive Formen und-Behandlung unter Winkel-v2(neueste Version) plus v4 betrachten:
https://github.com/angular/angular/issues/6895#issuecomment-290892514
Hoffentlich wird es eine native Unterstützung für diese Arten von Dingen, die bald...
InformationsquelleAutor der Antwort Matthew Erwin