"object's identity must change"在 Angular 中是什么意思?



我正在阅读这个Angular文档,它说:

对于任何类对象表达式——比如object、Array、Map或set——对象的标识必须改变,Angular才能更新类列表。更新属性而不更改对象标识不起作用。

那么,如何改变对象的标识呢?

谢谢。

这里的措辞有点令人遗憾。你不能真的改变对象的标识——标识就是对象。这就像试图让X不是X一样。它的意思是,Angular需要创建一个新的对象或数组来检测它的不同。在香草JS中的一个小例子:

const isSameObject = (obj1, obj2) => obj1 === obj2;
console.log(isSameObject({}, {})); // false, different objects
const someObj = {};
const sameReferenceToSomeObj = someObj;
sameReferenceToSomeObj.newProp = 'newVal';
console.log(isSameObject(someObj, sameReferenceToSomeObj)); // true, same object

要让Angular检测到属性标识的改变,必须将属性值更改为新值,而不是改变旧值。上面代码片段中的第二个例子是一个在Angular中如何使用而不是的例子;改变一个对象不会改变它的身份(它仍然是同一个对象),所以如果你在Angular中这样做,它会看到属性上的旧对象是===到属性上的新对象,并且不会因此产生视觉上的变化。

创建一个全新的对象,用想要的属性,并把这个对象放在组件上,然后Angular就能看到这个新对象不是旧对象的===,并采取相应的行动,例如

this.theClassList = { ...this.theClassList, newProperty: 'foo' }

const newClassList = this.theClassList;
newClassList.newProperty = 'foo';
this.theClassList = newClassList;

最新更新