Javascript 当数据单向发送时,聚合物会绑定
我目前正在一个项目中使用Polymer,出于某种原因,当我不期望也不想要它时,我得到了数据绑定 我目前拥有的是一个样板聚合物项目,应该有我创建的新元素(名为shokka eval chart)。这很有效,但不知何故,这三个元素之间正在共享信息 为了调试这个问题,我在console.log中添加了一些消息,告诉我发生了什么。每次控制台日志返回时,都表明userData已被修改。这种修改发生在哪里?为什么 您可能会注意到一些事情:Javascript 当数据单向发送时,聚合物会绑定,javascript,html,data-binding,polymer,polymer-1.0,Javascript,Html,Data Binding,Polymer,Polymer 1.0,我目前正在一个项目中使用Polymer,出于某种原因,当我不期望也不想要它时,我得到了数据绑定 我目前拥有的是一个样板聚合物项目,应该有我创建的新元素(名为shokka eval chart)。这很有效,但不知何故,这三个元素之间正在共享信息 为了调试这个问题,我在console.log中添加了一些消息,告诉我发生了什么。每次控制台日志返回时,都表明userData已被修改。这种修改发生在哪里?为什么 您可能会注意到一些事情: 使用单向数据绑定发送用户数据::[[userInfo.evaluat
shokka-eval-chart.html:89 Jan 16
shokka-eval-chart.html:91 40
shokka-eval-chart.html:92 40
shokka-eval-chart.html:93 0
shokka-eval-chart.html:89 Jan 16
shokka-eval-chart.html:91 0
shokka-eval-chart.html:92 40
shokka-eval-chart.html:93 -40
shokka-eval-chart.html:89 Jan 16
shokka-eval-chart.html:91 -40
shokka-eval-chart.html:92 40
shokka-eval-chart.html:93 -80
索引
为了解决这个问题。这解决了我遇到的问题,但仍然让我想知道为什么要从不同的标签修改userData。如果有人能发表评论并让我知道原因,我将不胜感激。我怀疑您期待这一行
var data = userData;
要创建userData
的副本,但在此行之后,data
和userData
指向相同的数据结构
试试看
var data = userData.splice();
只是猜测而已。如果这不是问题所在,我不知道是什么原因导致了问题。这可能就是问题所在,但我记不起我自己尝试时它是否有效。我在下面用斜体字强调 配置默认属性值 可以在properties对象中使用value字段指定特性的默认值。该值可以是基元值,也可以是返回值的函数 如果提供函数,则Polymer会对每个元素实例调用该函数一次 将属性初始化为对象或数组值时,请使用函数确保每个元素都有自己的值副本,而不是在元素的所有实例中共享对象或数组
来源:这将有助于我立即不更改用户数据。但是,我不明白为什么更改userData甚至会更改其他标记中的userData。当下一个标签更改userData时,为什么它已经更改了?实际上我不确定我是否理解您的问题,我只是怀疑这就是问题所在。当多个地方引用同一个数组实例,其中一个地方进行了更改,而其他地方引用了同一个数组实例时,请参见修改。如果只想一次更改数组,则不同的引用需要指向它们自己的数组副本
.splice()
创建这样的副本。您似乎希望传递数组的副本,而不是对原始数组的引用。事实并非如此。在尝试您的建议后,我发现数据返回时是一个空数组[]
。我做了一些挖掘,发现我也可以用同样的方式使用.slice()
。我试过了,它仍然给了我和我不使用它时一样的输出。这里有什么.splice()
可以做而.slice()
不适合我的事情吗?投票结果:我在看,你的意思是.slice()
。我很欣赏这个想法,因为这是我的一个重大疏忽。我想问题还是一样的,只是更深一层而已。在var data=userData.slice()之后
data
和userData
是不同的数组,但它们的元素也是数组,slice()
不做深度复制,只做浅层复制。这意味着userData
和data
的元素只是对相同数组的引用。您需要递归地运行slice()
。太好了,您已经解决了!我正要创建一个plunker,但我在JS:-/方面的速度非常慢,而接受的答案之所以有效,是因为您使用slice
创建了一个新的数组,并因此切断了对原始数组的引用。
var data = [];
for (var i = 0, len = userData.length; i < len; i++) {
data[i] = userData[i].slice();
}
var data = userData;
var data = userData.splice();
data: {
type: Object,
value: function() { return {}; }
}