我有一个数组,我想显示前N个元素。这个数组发生了变化,并且保存在我的应用中的另一个组件中。聚合物:变化不总是通过过滤器
我看到一个错误,但如果我显示所有的数组元素,一切都很好。如果我通过获取.slice()
的数组副本并将其放入另一个字段并显示为前N个元素过滤的字段来响应我的数组更改,那么一切都很好。但是,如果我只显示通过前N个元素过滤的原始数组,那么DOM从不更新为更改。
下面是展示了这个问题的bug的codepen减少:http://codepen.io/rictic/pen/ienJK?editors=101
全码:
<script src="http://www.polymer-project.org/platform.js"></script><script src="http://www.polymer-project.org/components/web-animations-js/web-animations.js"></script><link rel="import" href="http://www.polymer-project.org/components/polymer/polymer.html">
<my-app></my-app>
<script>console.clear()</script>
<polymer-element name='my-app'>
<template>
<template if='{{results}}'>
r in results
<ul>
<template repeat='{{ r in results }}'>
<li>{{r.value}} - {{r.name}}</li>
</template>
</ul>
r in processedResults | first(5)
<ul>
<template repeat='{{ r in processedResults | first(5) }}'>
<li>{{r.value}} - {{r.name}}</li>
</template>
</ul>
r in results | first(5)
<ul>
<template repeat='{{ r in results | first(5) }}'>
<li>{{r.value}} - {{r.name}}</li>
</template>
</ul>
</template>
</template>
<script>
</script>
</polymer-element>
<script>
'use strict';
var names = ['Alice', 'Bob', 'Charline', 'Daryl', 'Elise', 'Franz', 'Geraldine', 'Happsburg', 'Irene', 'Jerome'];
Polymer('my-app', {
results: [{value: 10, name: 'root'}],
first: function(a, k) {
// A filterer to display the first k elements of an array.
if (!a) {
return a;
}
return a.slice(0, k);
},
domReady: function() {
// Populate the results array.
for (var i = 0; i < 10; i++) {
this.results.push({value: i, name: names[i]});
}
// Once a second, mutate and sort the array
setInterval(function() {
var randomChoice = Math.round(Math.random() * (this.results.length - 1));
this.results[randomChoice].value *= 2;
this.results.sort(function(a, b) {
if (a.value != b.value) {
return b.value - a.value;
}
return a.name.localeCompare(b.name);
});
}.bind(this), 1000);
},
resultsChanged: function() {
// Copy this.results into this.processedResults.
this.processedResults = this.results.slice();
}
});
</script>
尝试初始化'results'准备就绪。如果属性是数组/对象,那么它们应该在那里初始化。 – user568109
我可以使[此](http://codepen.io/anon/pen/Ctzhl?editors=101)工作。但是,似乎是一个错误。除非完全修改,否则它不会观察对象属性的更改。 – user568109
关于初始化'结果'准备就绪的好处。在我的真实应用程序中,有另一个元素从服务器响应中获取JSON.parse的“结果”,然后在将结果赋予与上面的“my-app”相对应的元素后,它继续变更相同的数组使用'.push'和'.sort'。应用程序的行为仍然是上述错误。如果我有更多的时间,我想我可以逐步浏览代码,看看结果在哪里被观察到,以及在每种情况下的结果如何不同,这真的很有趣。 –