提问人:nathanielb91 提问时间:7/1/2023 更新时间:7/1/2023 访问量:144
如何检测 Angular @Input数组的变化?
How to detect changes on an Angular @Input array?
问:
我有一个表过滤组件,它的输入是一个对象数组。当组件初始化时,对象都会显示其属性。如果我硬编码显示数组一秒钟后,数组将显示数组中实际上的某些对象显示。我尝试使用 ngOnChanges(),但是 angular 不会检测到这些值何时更新。isFiltered: false
setTimeout()
isFiltered: true
父组件服务调用如下(这是我们所关注的):this.filters
this.supportedTypesService
.getSupportedPolicyTypes()
.pipe(
takeUntil(this.ngOnDestroy$),
finalize(() => (this.delayGettingPreferencesOnInit = false))
)
.subscribe((response: PolicyType[]) => {
this.filters = response.map((policyType: PolicyType) => {
return {
value: policyType,
text: PolicyType.getApiValue(policyType),
isChecked: false
};
});
});
this.filters
作为 HTML 中的子组件传递给子组件[filters]=filters
子组件具有:
@Input filters: Filter[]
public ngOnChanges(): void {
each(this.filters, (f: Filter) => {
if (f.isChecked) {
this.isFiltered = true;
return false; // to break from forEach loop
}
});
}
ngOnChanges() 不会检测数组中发生的更改。我也尝试过ngDoCheck(),但它似乎无限运行,让我担心性能问题。
答:
1赞
NIC
7/1/2023
#1
在您提供的父组件代码中,将每个筛选器条目的 isChecked 设置为 false。因此,this.filter 的内容也会在其他地方更新。
在父组件中更改 this.filter 的内容时,是否创建其新引用?
例如this.filter = {...this.filter};
Angular 无法检测到数组内部的变化。变量 this.filters 是一种指向内存位置的引用。更改数组元素时,引用(内存位置)保持不变,但它指向的内存内容会发生变化。因此,您需要创建一个新的引用,以通知子组件有关更改的信息。
评论