2016-07-20 9 views
2

Ich studiere Angular 2 Change Detection und ich habe einige Probleme, oder zumindest muss ich ein paar Erklärungen.Angular 2 Change Detection Mechanismus

ist die folgende vereinfachte Code von AppRef Lassen Sie bekommen (und von Througtram Blog):

class ApplicationRef { 

    changeDetectorRefs:ChangeDetectorRef[] = []; 

    constructor(private zone: NgZone) { 
    this.zone.onTurnDone 
     .subscribe(() => this.zone.run(() => this.tick()); 
    } 

    tick() { 
    this.changeDetectorRefs 
     .forEach((detector) => detector.detectChanges()); 
    } 
} 

Wir können davon ausgehen, dass es durch die Komponente ein Change ist. Ich gehe auch davon aus, dass es nur eine Zone.js Gabel in einer winkelförmigen 2 Anwendung gibt.

Ab jetzt lassen Sie uns die Code-Implementierung von detectChanges bekommen, wo es einen Vergleich, wie (vereinfacht) ist:

detectChanges(){ 
    //... 
if(this.previousValue !== newValue){ 
    this.previousValue = newValue 
} 

} 

Von diesem Punkt, wohl wissend, dass nur eine Zone.js Gabel alle Ereignisse auslösen und dann einen ChangeDetection-Zyklus starten, heißt das, dass alle Detektoren aus dem gesamten Komponentenbaum von diesem Vergleich betroffen sind? Ich meine, wenn ich 1000 Komponenten habe, habe ich 1000 Aufrufe, um Changes zu erkennen?

Danke für Ihre Hilfe

Antwort

2

Grundsätzlich ja, Angular jede Bindung von oben nach unten auf jeder Änderung Erfassungszyklus vergleicht.

Deshalb gibt es ChangeDetectionStrategy.OnPush, die das Überspringen von überprüfenden Komponenten (und seiner untergeordneten/untergeordneten Komponenten und Direktiven) zulässt, wenn für diese Komponente keine Eingabeeigenschaft geändert wurde.

+0

Vielen Dank, es ist jetzt klarer in meinen Gedanken: D – mfrachet

+0

Eine letzte Sache, wo ist der vorherige Zustand zum Vergleich gespeichert? Ich vermute, dass nach einem Änderungserkennungszyklus ein Vergleich vorliegt, der zu sagen hat, ob die Änderungserkennung zutreffen soll oder nicht. Weißt du, wo es im Quellcode liegt? – mfrachet

+1

Tut mir leid, bin noch nicht auf dieses gestoßen. Manchmal unterscheidet sich das in 'ngOnChanges' /' ngDoCheck' wie in 'ngFor' https://github.com/angular/angular/blob/b6746cce9c239a72264d1a8983db378ebc423638/modules/%40angular/common/src/directives/ng_for.ts# L100 aber für Bauteileigenschaften weiß ich nicht. Ich vermute, irgendwo in der Komponente. –