在observablearray中使用可观察属性推送对象仍然跟踪对象的属性。

时间:2013-05-06 13:23:44

标签: javascript knockout.js knockout-2.0

我有一个具有多个可观察属性的对象addItem。填充属性后,我将其推送到一个可观察的数组allItems,该数组跟踪会话期间创建的所有对象。

问题是当我将addItem推入allItems然后对addItem进行更改时; allItems也发生了变化。我假设一旦addItem被推入allItems,两者之间的绑定将不复存在,但它似乎只是添加了一个引用。

如何在没有参考的情况下将addItem添加到allItems

1 个答案:

答案 0 :(得分:3)

默认情况下,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)));

See the Fiddle