2016-04-03 36 views
1

我做了一个简单的概念证明Polymer 1.0应用程序,演示了我的问题:JSBin检测阵列突变

在我的问题,我使用array mutation methods改变的磁盘阵列,它包含了购物项目列表。

然而,这似乎并不如预期的工作。我dom-repeat和打印数组的长度时得到一个变化。 但是不要当我打印数组本身时,或者当我将它包装在函数中时,获取更改事件。

总之,这是为什么这样工作?

<p>Number of items: [[list.length]]</p> 

?为什么这个工作?

<p>Items inline: [[list]]</p>  
<p>Observe function : [[_observe(list)]]</p> 

此外,当我取消注释以下行(在JSBin),事情似乎为indened工作。但我不喜欢它,因为它有点冒险。

app.notifyPath('list', app.list.slice()); 

我已经阅读了本发行于slice()修复跌跌撞撞:https://github.com/Polymer/polymer/issues/2068


编辑

因此,审查意见后,回答这个问题:“这是由设计“是肯定的。该阵列本身不会改变(因为它只是一个参考),但它的属性更改。这就是为什么slice()强制重新加载,因为它创建了一个浅拷贝。

然而,人们可以说这是否正常。是的,变量list本身没有变化本身。但将[[list]]放入HTML代码中实际触发了toString()。并且该函数的结果已经更改为

我想我坚持了捎带的length财产现在...

+0

您jsbin采样工作正常,我在Chrome –

+0

,它只是因为链接对象它只是链接,它并没有改变,观察list.length和返回列表 –

+0

或者你可以在一些var中备份链接到数组,通知没有第二个参数,并立即通知备份列表,我不知道什么更快,但这种方法不需要克隆数组,并且更多的不需要深入在复杂情况下克隆。 –

回答

2

所提到的注释中的notifyPathslice调用创建数组的一个浅表副本,并分配一个不同的参考背list变量 - 触发绑定的更新。如果没有保持一个独立的(可以观看)变量或对象引用乱搞,唯一的解决办法我能想到的是上捎带上list.length属性,而不是名单本身并传递通过某种“格式化”功能。 例如

<p>Items inline: [[format(list.length)]]</p> 
app.format = function(){ 
    return app.list.toString(); 
}; 

» Fiddle


正如@zb指出,你可以扩大这一点,并通过将相关变量作为自变量也使功能上重复使用任何数组:

<p>Items inline: [[format(list, list.length)]]</p> 
如果你想知道为什么观察者不会触发3210

» Fiddle

+1

我宁愿http://jsbin.com/mocagujapi/1/edit?html,js,输出 –

+1

叶我想这会使它可重用。不管怎么说,这个用例是相当有限的。 – Emissary

+0

@zb'和@Emissary我已经更新了一下我的问题。但是这可能不会改变问题的解决方案:捎带'length'属性。 – alesc