Javascript 检测阵列突变

Javascript 检测阵列突变,javascript,arrays,polymer-1.0,mutation,Javascript,Arrays,Polymer 1.0,Mutation,我制作了一个简单的概念验证聚合物1.0应用程序,演示了我的问题: 在我的问题中,我使用更改数组,该数组包含购物项目列表 然而,这似乎没有达到预期效果。我确实在dom repeat和打印数组长度时得到了更改。但是,当我打印数组本身或将其包装到函数中时,我不会获得更改事件 简言之,这是为什么 <p>Number of items: [[list.length]]</p> 通过阅读本期文章,我偶然发现了slice()fix: 编辑 因此,在审查了这些评论之后,“这是设计的吗

我制作了一个简单的概念验证聚合物1.0应用程序,演示了我的问题:

在我的问题中,我使用更改数组,该数组包含购物项目列表

然而,这似乎没有达到预期效果。我确实在
dom repeat
和打印数组长度时得到了更改。但是,当我打印数组本身或将其包装到函数中时,我不会获得更改事件

简言之,这是为什么

<p>Number of items: [[list.length]]</p>
通过阅读本期文章,我偶然发现了
slice()
fix:


编辑

因此,在审查了这些评论之后,“这是设计的吗”这个问题的答案是肯定的。数组本身不会改变(因为它只是一个引用),但它的属性会改变。这就是为什么
slice()
会强制重新加载,因为它会创建一个浅拷贝

然而,人们可能会争论这是否可行。是的,变量
列表
本身不会改变。但是将
[[list]]
放入HTML代码实际上会触发
toString()
。这个功能的结果已经改变了


我想我现在只能使用
length
属性了…

正如注释中提到的那样,
notifyPath
slice
调用正在创建数组的浅层副本,并将不同的引用分配回
列表
变量-触发绑定的更新。如果不维护一个单独的(可观察的)变量或不处理对象引用,我唯一能想到的其他解决方法就是使用
list.length
属性,而不是列表本身,并通过某种“格式化”函数传递它例如

项目内联:[[格式(list.length)]]

app.format=function(){
返回app.list.toString();
};


正如您所指出的,您可以在此基础上进行扩展,并通过将相关变量作为参数传递,使函数可用于任何数组:

项目内联:[[格式(列表,列表.长度)]]

app.format=函数(列表){
return list.toString();
};

你的jsbin示例在Chromei中对我很好如果你想知道为什么observer没有被触发,这仅仅是因为链接到对象它只是链接,并且没有改变,请观察list.length和return list,或者你可以备份链接到某个变量中的数组,不使用第二个参数通知,使用backedUp list立即通知,我不确定要快些什么,但这种方法不需要克隆阵列,更重要的是,在复杂情况下不需要深度克隆。其他解决方案(在更改阵列值的情况下)可以是设置notifier对象,该对象的值在每次更新阵列时都需要更改,您不能仅仅通过属性或子属性值来观察整个数组或任何其他对象,因为在一般情况下,它会非常缓慢,我想这会使它可重用。不管怎么说,这有点混乱,用例相当有限。@zb”和@Emissary我已经更新了一点我的问题。但这可能不会改变问题的解决方案:搭载
length
属性。
<p>Items inline: [[list]]</p>    
<p>Observe function : [[_observe(list)]]</p>
app.notifyPath('list', app.list.slice());