gpt4 book ai didi

angular - 检测 Angular2 中数组内对象的变化

转载 作者:太空狗 更新时间:2023-10-29 17:02:20 26 4
gpt4 key购买 nike

使用 Angular 2 和 typescript 。我有一个数组,我使用 DoCheck 和 IterableDiffer 来监听代码中的更改。当数组更改时,我会收到通知,但是当数组中的一个对象内的属性发生更改时,我不会收到通知。我尝试使用 KeyValueDiffer 但它不起作用。我想也许我需要以不同的方式使用“_differs.find”。有什么想法吗?

@Component({
selector: 'test'
})
@View({
template: `
<div>hello!</div>`
})
export class MyComponent implements DoCheck {

private _differ: IterableDiffer;
private _differ2: KeyValueDiffer;
_myItems: MyItem[];
@Input()
set myItems(value: MyItem[]) {
this._myItems = value;

if (!this._differ && value) {
this._differ = this._iterableDiffers.find([]).create(null);
}
if (!this._differ2 && value) {
this._differ2 = this._differs.find(this._myItems).create(null);
}
}
get myItems() {
return this._myItems;
}

constructor(private _iterableDiffers: IterableDiffers, private _differs: KeyValueDiffers, private _myService: MyService) {
this.myItems = _myService.getItems();
}

ngDoCheck() {

var changes = this._differ.diff(this._myItems);

if (changes) {
changes.forEachAddedItem((record) => {
console.log('added ' + record.item);
});
changes.forEachRemovedItem((record) => {
console.log('removed ' + record.item);
});
}

var changes2 = this._differ2.diff(this._myItems);
if (changes2) {
changes2.forEachChangedItem(
(record) => {
console.log(record.key + "," + record.currentValue);
}
});
}
}
}

无法获得有关 MyItem 属性之一更改的通知

最佳答案

事实上,您需要检查列表中每个对象的差异,而不是列表本身。 KeyValueDiffer 必须应用于对象而不是数组。

您可以初始化一个包含数组元素的所有这些 KeyValueDiffer 实例的对象:

constructor(private differs:  KeyValueDiffers) {
}

ngOnInit() {
this.objDiffer = {};
this.list.forEach((elt) => {
this.objDiffer[elt] = this.differs.find(elt).create(null);
});
}

ngDoCheck 中,您需要遍历 differ 以检查是否有更改(对于数组的每个项目):

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();
}
});
}
});
}

查看此插件:http://plnkr.co/edit/JV7xcMhAuupnSdwrd8XB?p=preview

请注意,我跳过了数组的变化检测...但两者可以并行完成。此外,当添加/删除元素时,KeyValueDiffers 列表应相应更新。

关于angular - 检测 Angular2 中数组内对象的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35748484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com