簡體   English   中英

在DoCheck之后,角度2的輸入屬性更改未通過角度檢測到

[英]Angular 2 input propery changes is not detect by angular after DoCheck

我使用DoCheck來檢測ngFor傳遞的輸入屬性中的重要更改。 它正常工作。 但是,當我進行了一些更改(從ngFor迭代的數組中刪除一項)時,我的子組件看不到任何更改,也沒有重新呈現自身。

也許我做錯了什么?

 ngDoCheck() {
    console.log('zz');
    var changes = this._differ.diff(this.schedulerData);
    console.log(changes);
    if(changes) {
        changes.forEachAddedItem(r => {
            console.log(r);
            if (r.key === 'tasks') this.launchScheduler();
        });
    }
}

ngOnInit() {
        console.log(this.schedulerData);

    }  /* !ngOnInit */


ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {

    for (let propName in changes) {
     if (propName === 'schedulerData') {
console.log(changes[propName]);

     }
    }
}

默認情況下,更改檢測不會檢測到對象或數組中的更新,而是當對象引用發生更改時。

如果您想繞過此行為, ngDoCheck像執行ngDoCheck一樣使用ngDoCheck是正確的方法。 就您而言,這是正常行為:

  • 您可以利用IterableDiffers類從ngDoCheck方法監聽數組更新
  • ngOnChanges方法未調用,因為它是由默認更改檢測器(檢測對象引用更改)觸發的。

否則,請從文檔中獲取信息:

請注意,指令通常不應同時使用DoCheck和OnChanges來響應同一輸入上的更改。 當默認更改檢測器檢測到更改時,將繼續調用ngOnChanges,因此通常不必在兩個掛鈎中都響應同一輸入上的更改。 必須在ngDoCheck回調中處理對更改的反應。

添加或刪除陣列時,不會觸發更改檢測。 這是因為數組引用不會更改。 (因此,僅添加或刪除某些內容並不會根據更改檢測“更改”數組)。

如果要檢測變化,請注意這些變化,您需要更改對陣列的引用。 例如,我想到的最簡單的方法是在數組上使用array.slice 此方法調用將返回一個新數組,如果您將舊數組分配給該數組,則將有一個新引用,並且更改檢測將注意到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM