In fact, you need to check differences for each object in the list not on the list itself. KeyValueDiffer
must be applied on an object not on an array.
You could initialize an object containing all these KeyValueDiffer
instances for the elements of your array:
constructor(private differs: KeyValueDiffers) {
}
ngOnInit() {
this.objDiffer = {};
this.list.forEach((elt) => {
this.objDiffer[elt] = this.differs.find(elt).create(null);
});
}
Within the ngDoCheck
, you need then to iterate over the differ
s to check there are changes (for each item of the array):
ngDoCheck() {
this.list.forEach(elt => {
var objDiffer = this.objDiffer[elt];
var objChanges = objDiffer.diff(elt);
if (objChanges) {
objChanges.forEachChangedItem((elt) => {
if (elt.key === 'prop1') {
this.doSomethingIfProp1Change();
}
});
}
});
}
See this plunkr: http://plnkr.co/edit/JV7xcMhAuupnSdwrd8XB?p=preview
Notice that I skipped the change detection for the array... But both can be done in parallel. Moreover when elements are added / removed the list of KeyValueDiffers
should be updated accordingly.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…