【问题标题】:Polymer prevent databinding聚合物防止数据绑定
【发布时间】:2015-01-27 02:17:02
【问题描述】:

数据绑定很好,很好。但是这一次它妨碍了我。

我有一个默认的users 数组,我在我的页面上的每个item 中插入它。这个想法是每个item 都有一个用于每个user 的复选框。

目前我像这样创建我的emptyUsers-item:

for(var i = 0; i < this.users.length; i++){
    this.emptyUsers.push({"id": this.users[i].id, "set": false});
}

注意:this.users 来自数据库

然后我将此数组推送到页面上的每个项目

item = {"id": data[i].itemId, "text": data[i].text, "users": this.emptyUsers};

注意:data 来自数据库

现在的问题是,当我更改项目中一个用户的set-属性时,该用户的所有项目的set-属性都会更改。我认为这是由于我使用push() 将用户插入到项目中,因此数据绑定在某处播放。确实是这样,我该如何防止这种行为?

【问题讨论】:

  • 当您使用数组/对象并已初始化双向数据绑定时,所有元素将具有相同的引用。如果您更改数据,则无法阻止其他人获得更改,如果您希望在 那个对象上进行双向数据绑定。
  • @FuzzicalLogic:那我该如何预防呢?我只需要item 的数组作为数据绑定对象,而不是它的用户。 (项目对象的结构为[{"id" : int, "text": string, "users": [{"id": int, "checked": bool}]}]

标签: javascript data-binding polymer 2-way-object-databinding


【解决方案1】:

发生这种情况是因为您为每个对象提供了一个对emptyUsers 数组的引用。如果每个对象从一开始就应该有自己的数组,您可以在首次绑定数据时通过在emptyUsers 上调用slice() 创建一个副本。这只会创建一个浅拷贝;如果您需要每个对象在数组中也有自己的元素副本,您应该搜索“js array deep copy”:

item = {"id": data[i].itemId, "text": data[i].text, "users": this.emptyUsers.slice()};

【讨论】:

  • slice() 仍然没有解决问题,但是this answer 的链接提供的深层复制有一些方法似乎确实有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多