在可观察数组中推入具有可观察属性的对象仍然跟踪对象的属性
Pushing object with observable properties in observable array still track object's propteries.
我有一个对象addItem
有几个可观察的属性。一旦属性被填充,我将其推入一个可观察数组allItems
,该数组跟踪会话期间创建的所有对象。
问题是,当我将addItem
推入allItems
然后对addItem
进行更改时;allItems
也改变了。我认为一旦addItem
被推入allItems
,两者之间的绑定就不再存在了,但看起来推入只是增加了一个引用。
如何在没有引用的情况下添加addItem
到allItems
?
默认情况下,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)));
参见
相关文章:
- 未激发路由的控制器属性上的观察者
- Knockout observable没有观察到其中一个属性
- 将属性设置为未定义时未通知观察者
- Ember:当子控制器同时观察到父控制器触发请求的相同属性时
- 观察ES6模块属性
- 如何从具有动态可观察属性的淘汰对象中获取 JSON 字符串
- 观察多个$scope属性
- KO 绑定复选框:从代码更改“选中”属性,不更改可观察字段
- 更新挖空中可观察数组中项目的属性
- AngularJS:观察数组属性
- AngularJS观察指令属性表达式,动态继承作用域
- 聚合物通过父对象观察子属性
- 初始化可从元素属性值观察到的Knockout
- 如何使用ES6在Ember中声明可观察性或计算属性
- 如何观察聚合物元素属性值从索引.html的变化
- 当可观察数组是其他模型的属性时,挖空不会更新 UI
- 获取可观察数组项的子属性以触发更改
- 聚合物中的“观察者”与“通知”(在属性块中)与“观察者”与“侦听器”之间的区别
- 使用挖空 JS 映射选项将可观察属性添加到映射的可观察数组
- 余烬在加载时观察到异步属于关系属性