【问题标题】:Pushing object with observable properties in observable array still track object's propteries.在可观察数组中推送具有可观察属性的对象仍会跟踪对象的属性。
【发布时间】:2013-05-06 13:23:43
【问题描述】:

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

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

如何在没有引用的情况下将addItem 添加到allItems?

【问题讨论】:

  • 你能显示一些代码吗?但一般来说,你必须自己复制你的属性......
  • 如果你不想让 allItems 收到通知,因为其中一个项目发生了变化,然后因为它发送更新,你只需要一个简单的数组,而不是可观察的数组,不是吗?
  • @Jalayn,一个 `ko.observableArray' 只会在实际数组更改时通知(即添加、删除或替换项目)。如果项目上的属性发生更改,可观察数组不会跟踪这些更改,因此不会通知数组订阅者。
  • @JosephGabriel 你当然是对的,我不明白保留引用有什么问题......除非他只是想要对象的副本或哈希,如果是这样的话那么你的答案肯定是正确的。
  • 不用担心 :) 我可能误解了你的评论。我发现更新可观察数组中对象的对象属性是一个常见的误解,所以我认为它说明的次数越多越好。

标签: javascript knockout.js knockout-2.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2017-09-07
    • 1970-01-01
    • 2014-10-23
    • 2021-03-30
    • 2016-01-21
    相关资源
    最近更新 更多