聚合物防止数据绑定

Polymer prevent databinding

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

我在页面上的每个 item 中插入了一个默认的 user 数组。这个想法是每个 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来自db

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

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

注:data来自db

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

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

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