In AngularJS konnten Sie Beobachter angeben, um Änderungen in Bereichsvariablen mithilfe der $watch
Funktion von zu beobachten $scope
. Was entspricht der Suche nach Variablenänderungen (z. B. in Komponentenvariablen) in Angular?
213
Antworten:
In Angular 2 erfolgt die Änderungserkennung automatisch ...
$scope.$watch()
und$scope.$digest()
RIPLeider ist der Abschnitt "Änderungserkennung" des Entwicklungshandbuchs noch nicht geschrieben (es gibt einen Platzhalter am unteren Rand der Seite " Architekturübersicht " im Abschnitt "Das andere Zeug").
Hier ist mein Verständnis der Funktionsweise der Änderungserkennung:
setTimeout()
in unseren Komponenten etwas verwenden können, anstatt so etwas wie$timeout
... weilsetTimeout()
Affen gepatcht sind.ChangeDetectorRef
.) Diese Änderungsdetektoren werden erstellt, wenn Angular Komponenten erstellt. Sie verfolgen den Status aller Ihrer Bindungen, um sie schmutzig zu überprüfen. Diese ähneln in gewissem Sinne der Automatik$watches()
, die Angular 1 für{{}}
Vorlagenbindungen einrichten würde .Im Gegensatz zu Angular 1 ist das Änderungserkennungsdiagramm ein gerichteter Baum und kann keine Zyklen aufweisen (dies macht Angular 2 viel leistungsfähiger, wie wir weiter unten sehen werden).
onPush
Änderungserkennungsstrategie für keine Ihrer Komponenten verwenden) wird jede Komponente im Baum einmal (TTL = 1) ... von oben in der Reihenfolge der Tiefe zuerst untersucht. (Wenn Sie sich im Entwicklungsmodus befinden, wird die Änderungserkennung zweimal ausgeführt (TTL = 2). Weitere Informationen hierzu finden Sie in ApplicationRef.tick () .) Mit diesen Änderungsdetektorobjekten werden alle Bindungen schmutzig überprüft.Wenn die zu überwachenden Komponentendaten eine primitive Eingabeeigenschaft (String, Boolean, Number) sind, können Sie implementieren
ngOnChanges()
, um über Änderungen benachrichtigt zu werden.Wenn die Eingangs Eigenschaft ein Referenztyp (Objekt, ein Array, etc.), aber die Referenz hat sich nicht verändert (zB hinzugefügt Sie ein Element auf ein bestehendes Array), müssen Sie implementieren
ngDoCheck()
(siehe diese SO Antwort für mehr dazu).Sie sollten nur die Eigenschaften der Komponente und / oder Eigenschaften von untergeordneten Komponenten ändern (aufgrund der Implementierung eines einzelnen Tree Walks - dh des unidirektionalen Datenflusses). Hier ist ein Plunker , der das verletzt. Stateful Pipes können Sie auch hierher stolpern .
Weitere Referenzen, um mehr zu erfahren:
onPush
.quelle
host
Dokumentation "Host Listener" im DirectiveMetadata API-Dokument . Es wird erklärt, wie globale Ereignisse innerhalb der Winkelzone abgehört werden (sodass die Änderungserkennung wie gewünscht ausgelöst wird). Diese Antwort hat einen funktionierenden Plunker.Dieses Verhalten ist jetzt Teil des Komponentenlebenszyklus.
Eine Komponente kann die ngOnChanges-Methode in der OnChanges- Schnittstelle implementieren, um Zugriff auf Eingabeänderungen zu erhalten.
Beispiel:
quelle
Wenn Sie zusätzlich zur automatischen bidirektionalen Bindung eine Funktion aufrufen möchten, wenn sich ein Wert ändert, können Sie die Syntax der bidirektionalen Bindungsverknüpfung auf die ausführlichere Version umstellen.
<input [(ngModel)]="yourVar"></input>
ist eine Abkürzung für
<input [ngModel]="yourVar" (ngModelChange)="yourVar=$event"></input>
(Siehe z. B. http://victorsavkin.com/post/119943127151/angular-2-template-syntax )
Sie könnten so etwas tun:
<input [(ngModel)]="yourVar" (ngModelChange)="changedExtraHandler($event)"></input>
quelle
Sie können
getter function
oderget accessor
als Uhr auf Winkel 2 verwenden.Siehe Demo hier .
quelle
Hier ist ein anderer Ansatz, bei dem Getter- und Setter-Funktionen für das Modell verwendet werden.
quelle
(change)
jedem einzelnen Handler hinzufügen . Ich möchte nichtget|sets
jeder Eigenschaft in meinem Modell s hinzufügen . es wird nicht helfen, einget|set
für hinzuzufügenthis.object
;ngOnChanges()
erkennt nur Änderungen an@Input
s . Heiliges Manna! Was haben sie mit uns gemacht ??? Geben Sie uns eine Art Deep Watch zurück!Wenn Sie es in
[(yourVar)]
beide Richtungen binden möchten, können Sie es verwenden , müssen es jedoch implementierenyourVarChange
es in beide Ereignis und es jedes Mal aufrufen, wenn sich Ihre Variable ändert.So etwas, um den Heldenwechsel zu verfolgen
und wenn sich dein Held umzieht, ruf an
this.heroChange.emit(this.hero);
Die
[(hero)]
Bindung erledigt den Rest für Siesiehe Beispiel hier:
http://plnkr.co/edit/efOGIJ0POh1XQeRZctSx?p=preview
quelle
Versuchen Sie dies, wenn Ihre Anwendung weiterhin Anforderungen
$parse
stellt$eval
, z.$watch
B. das Verhalten in Angularhttps://github.com/vinayk406/angular-expression-parser
quelle
Dies beantwortet die Frage nicht direkt, aber ich bin bei verschiedenen Gelegenheiten auf diese Stapelüberlauffrage gestoßen, um etwas zu lösen, für das ich $ watch in angleJs verwenden würde. Am Ende habe ich einen anderen Ansatz als in den aktuellen Antworten beschrieben gewählt und möchte ihn teilen, falls jemand ihn nützlich findet.
Die Technik, mit der ich etwas Ähnliches erreiche,
$watch
besteht darin, einBehaviorSubject
( mehr zum Thema hier ) in einem Angular-Dienst zu verwenden und meine Komponenten es abonnieren zu lassen, um die Änderungen zu erhalten (zu beobachten). Dies ähnelt a$watch
in angleJs, erfordert jedoch etwas mehr Einrichtung und Verständnis.In meiner Komponente:
In meinem Dienst
Hier ist eine Demo zu Stackblitz
quelle