聚合物防止数据绑定
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()};
数据绑定不错,很好。但是这一次它妨碍了我。
我在页面上的每个 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()};