如何正确使用数组的角度信号效果?

问题描述 投票:0回答:1

我正在尝试使用新的角度信号效果来监听对象信号数组的变化。

但是效果并不会随时被调用。

仅当我过滤掉数组中的一个对象时才会调用它。 推送和更新数组的对象不会调用效果。

这是我的代码:

// this code trigger the effect
case "DELETE":
          this.houses.update(((houses: House[]) => houses.filter((house: House) => house.id !== payload.old.id)));
          break;
// this code doesn’t trigger the effect
        case "INSERT":
          this.houses.update((houses: House[]) => {const updatedHouses = houses.push(payload.new); return updatedHouses;})
          break;
effect(() => {
      this.filteredHouses = this.houses();
      this.onFilter();
    });

遵循我重置信号值并随后设置新值,效果将被调用。我做错了什么?

angular signals effect angular17
1个回答
0
投票

如果信号值的对象引用没有改变,则不会触发效果(或变化检测)。信号在底层使用 Object.is 来检查相等性。这意味着就地修改数组(推送、排序等)不被视为“更改”。 一个简单的解决方案是在更新数组时使用展开运算符,如下所示:

this.houses.update(houses => ([...houses, payload.new]))

或者您可以将自定义相等函数传递给信号,如下所示:

houses = signal([], { equal: (a, b) => a.every(item => b.includes(item)) })

有关信号的 Angular 文档了解更多信息

© www.soinside.com 2019 - 2024. All rights reserved.