Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更新模板dom重复项中的数组未反映到dom_Javascript_Polymer - Fatal编程技术网

Javascript 更新模板dom重复项中的数组未反映到dom

Javascript 更新模板dom重复项中的数组未反映到dom,javascript,polymer,Javascript,Polymer,考虑以下代码: <template is="dom-repeat" items="{{chats}}" as="item"> <p>{{item.name}}</p> <span>{{item.unreadcount}}</span> </template> 如果数组完全更改,如何实现重新呈现dom 编辑 多亏了玛丽亚的提示,我才知道怎么做 仅使用splice()是不够的,还需要使用Polymer的函数来修

考虑以下代码:

<template is="dom-repeat" items="{{chats}}" as="item">
    <p>{{item.name}}</p>
    <span>{{item.unreadcount}}</span>
</template>
如果数组完全更改,如何实现重新呈现dom

编辑

多亏了玛丽亚的提示,我才知道怎么做

仅使用
splice()
是不够的,还需要使用Polymer的函数来修改数组本身:
this.set(…,…)

(i=0;i this.set('chats.+i+'.unreadcount',Math.floor(Math.random()*10)+1); } this.chats=this.chats.slice();
我的额头开始变平,因为从Polymer开始,我的头撞到了墙上。这里的问题是,在所有这些操作之后,你的
聊天
属性仍然是数组的同一个实例。在您尝试的任何方法中,Polymer都会检查实例是否已更改,而不会检查数组中的项是否有更改。解决此问题的一种方法是创建数组的新副本,并将其分配给
chats

this.chats = c.slice();
更新

虽然我很确定上面提到的方法在某些时候是有效的,但我可以确认它已经不起作用了。我假设聚合物以某种方式缓存了旧值。因此,我认为使用
set
API的解决方案是现在最好的方法。我发现下面的方法也很有效,但我猜在大多数情况下效率较低。它重置数组,然后异步设置新值。在这种情况下,甚至不需要切片

this.chats = [];

this.async(function() {
    this.set("chats", c);
});

谢谢你的回答。这已经是一个改进:-)如果在执行此操作之前。chats=slice(c);我向数组中添加了另一个元素(c.push({…})),它现在显示在dom中。但是,数组中对象属性的更改仍然没有反映在dom中:-(您好,感谢您的更新。很遗憾,仅仅使用slice()不再有效。因为现在当我从后端获取新数组时,需要进行一些修改,以便让dom了解它:)如果您使用
this.set
,执行所有操作,您不需要
this.chats=this.chats.slice()。你试过移除它并检查它是否仍然有效吗?
this.chats = c.slice();
this.chats = [];

this.async(function() {
    this.set("chats", c);
});