在可观察数组中推入具有可观察属性的对象仍然跟踪对象的属性

Pushing object with observable properties in observable array still track object's propteries.

本文关键字:属性 观察 对象 跟踪 数组      更新时间:2023-09-26

我有一个对象addItem有几个可观察的属性。一旦属性被填充,我将其推入一个可观察数组allItems,该数组跟踪会话期间创建的所有对象。

问题是,当我将addItem推入allItems然后对addItem进行更改时;allItems也改变了。我认为一旦addItem被推入allItems,两者之间的绑定就不再存在了,但看起来推入只是增加了一个引用。

如何在没有引用的情况下添加addItemallItems ?

默认情况下,ko.observable项在被添加到数组后仍然是可观察的。如果你想删除可观察性,你需要创建一个具有不可观察属性的对象。

一种方法是手动复制属性,使用ko.utils.unwrapObservable(obj.prop)

一个更"自动"的方法是使用ko.toJS()——这将把一个具有可观察属性的对象转换成一个普通的JS对象。

self.allItems.push(ko.toJS(self.item2));

或者如果你想单独维护数组中的项的可观察性,你可以使用ko.mapping.fromJS:

读取它。
allItems.push(ko.mapping.fromJS(ko.toJS(self.item2)));

参见