如何检测 Angular @Input数组的变化?

How to detect changes on an Angular @Input array?

提问人:nathanielb91 提问时间:7/1/2023 更新时间:7/1/2023 访问量:144

问:

我有一个表过滤组件,它的输入是一个对象数组。当组件初始化时,对象都会显示其属性。如果我硬编码显示数组一秒钟后,数组将显示数组中实际上的某些对象显示。我尝试使用 ngOnChanges(),但是 angular 不会检测到这些值何时更新。isFiltered: falsesetTimeout()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(),但它似乎无限运行,让我担心性能问题。

JavaScript 数组 angular typescript 输入

评论


答:

1赞 NIC 7/1/2023 #1

在您提供的父组件代码中,将每个筛选器条目的 isChecked 设置为 false。因此,this.filter 的内容也会在其他地方更新。

在父组件中更改 this.filter 的内容时,是否创建其新引用? 例如this.filter = {...this.filter};

Angular 无法检测到数组内部的变化。变量 this.filters 是一种指向内存位置的引用。更改数组元素时,引用(内存位置)保持不变,但它指向的内存内容会发生变化。因此,您需要创建一个新的引用,以通知子组件有关更改的信息。