2016-07-20 8 views
2

角度2の変化検知を研究していますが、何か問題があったり、少なくとも私はいくつかの説明が必要です。角度2の変化検知機構

はのはAppRefから(とThrougtramのブログから)以下の単純化されたコードを取得してみましょう:

class ApplicationRef { 

    changeDetectorRefs:ChangeDetectorRef[] = []; 

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

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

私たちは、コンポーネントによって1 changeDetectorがあることを前提とすることができます。 1つのAngle 2アプリケーションでZone.jsフォークが1つだけ使用されていると仮定しています。今から

、のような(簡体字)などの比較があるdetectChanges、のコードの実装を取得してみましょう:

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

} 

そのポイントから、一つだけZone.jsフォークは、すべてのイベントをトリガすることを知っていますchangeDetectionサイクルを開始します。これは、すべてのコンポーネントツリーのすべてのディテクタがこの比較によってコンカナリングされることを意味しますか? 1000個のコンポーネントがある場合、1000個の呼び出しを検出するでしょうか?あなたの助け

答えて

2

ため

おかげで基本的には、はい、角度は、すべてそれぞれの変更検出サイクルに上から下への結合を比較します。

ChangeDetectionStrategy.OnPushがあり、このコンポーネントの入力プロパティが変更されていない場合、コンポーネント(およびその子/子孫コンポーネントとディレクティブ)をスキップすることができます。

+0

ありがとう、それは今、私の心の中で明確です:前の状態を比較のために保存されているD – mfrachet

+0

最後に一つだけ、?私は、変化検出サイクルの後に、変化検出を適用するかどうかを言わなければならない比較があると思います。ソースコードのどこにあるのか知っていますか? – mfrachet

+1

申し訳ありませんが、まだこれにつまずくことはありませんでした。時には 'ngFor' https://github.com/angular/angular/blob/b6746cce9c239a72264d1a8983db378ebc423638/modules/%40angular/common/src/directives/ng_for.ts#のように' ngOnChanges'/'ngDoCheck'でのように使用されている異なりL100ですが、コンポーネントのプロパティではわかりません。私はコンポーネントのどこかにいると思います。 –