1

我制作了一个简单的概念验证 Polymer 1.0 应用程序来演示我的问题:JSBin

在我的问题中,我使用数组突变方法来更改包含购物项目列表的数组。

但是,这似乎没有按预期工作。我确实dom-repeat在打印数组的长度时发生了变化。但是当我打印数组本身或将其包装在函数中时,我没有收到更改事件

简而言之,为什么会这样?

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

为什么这不起作用

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

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

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

slice()我通过阅读这个问题偶然发现了修复: https ://github.com/Polymer/polymer/issues/2068


编辑

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

但是,有人可能会争论这是否可行。是的,变量本身list不会改变。但放入HTML 代码实际上会触发. 并且该功能的结果已经改变。[[list]]toString()

我想我现在只能捎带这处length房产了……

4

1 回答 1

2

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

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

» 小提琴


正如@zb所指出的,您可以对此进行扩展,并通过将相关变量作为参数也传递给任何数组来使函数可重用:

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

» 小提琴

于 2016-04-03T16:41:42.770 回答