2016-08-30 11 views
2

まず私はこの私のngDoCheck方法でを持っていたし、完璧に動作します:DoCheckのKeyValueDiffersはコンポーネントごとに1つのオブジェクトに対してのみ機能しますか?

var productChanges = this.differ.diff(this.myProduct); 

はその後、私のコンポーネントの第2のモデルで変更をチェックすることを決定し、ラインの下にこれを追加しました:

var companyChanges = this.differ.diff(this.myCompany); 

と両方の変更別のifステートメントで処理されますが、最後のステートメントのみが呼び出されます(companyChanges)

これは予期した動作ですか? ngDoCheckはコンポーネントごとに1つのオブジェクトに対してのみ機能しますか?ここで明確にするために

は私の完全なngDoCheck方法である:

ngDoCheck() { 
    var productChanges = this.differ.diff(this.myProduct); 

    //DOESN'T IT CHECK 2 MODELS LIKE SO BELOW ? 
    //var companyChanges = this.differ.diff(this.myCompany); 

    if (productChanges) { 
     // console.log('Product changes detected'); 

     productChanges.forEachChangedItem((r: KeyValueChangeRecord) => { 

      if (r.currentValue && r.currentValue != r.previousValue) { 
       this.filterProduct(r.currentValue, r.key); 

      } 
     }); 
    } 

編集:私はこれを共有する必要があると感じ、他の質問と回答を読むことによって

コンポーネントのコンストラクタである異なります次のように定義されています:

this.differ = differs.find({}).create(null); 

おそらく、これは最初に変更する必要があります。この質問のための@ティエリー・TEMPLIERからの回答を読んだ後

答えて

4

Detect changes in objects inside array in Angular2私はそれがどのように機能するかを理解しました:

クラスのレベルは、各モデルが注目されるように、その値のためとして、彼らが必要とするために、オブジェクトが別のキーを含まなければならない異なりますngOnInitまたはコンストラクターで、それぞれのモデルをそれぞれ参照する別々のウォッチャーに設定されます。 (ThierryはngOnInitでそれを行いました。私はコンストラクタでそれを行いました)

constructor(private differs: KeyValueDiffers){ 
    this.differ = {}; 

    this.differ['myCompany'] = differs.find(this.myCompany).create(null); 
     . 
     . 
     . 
    this.differ['myProduct'] = differs.find(this.myProduct).create(null); 
} 

ngDoCheck() { 
    var productChanges = this.differ['myProduct'].diff(this.myProduct); 
    var companyChanges = this.differ['myCompany'].diff(this.myCompany); 

    if (productChanges) { 
     // Do your thing 
    } 

    if (companyChanges) { 
     // Do your thing 
    } 
} 
関連する問題