聚合物:强制 dom-repeat 重新计算所有项目的索引
Polymer: forcing dom-repeat to recalculate all the item's index
我有一个 dom-repeat,它显示了大量项目(大约 9000 个)。
我试图只显示部分项目,这样我就不会得到一个巨大的滚动条。为此,我使用 dom-if 仅显示索引大于 10 的项目。
当 dom-repeat 被排序或过滤时,每个项目的索引都会重新计算,所以效果很好。
然后我使用 iron-scroll-threshold 来检测用户何时滚动到页面底部,然后我增加显示的项目数。
问题是,这不是重新计算索引 - 换句话说,我不知道如何 "redraw" dom-repeat。
有没有办法强制dom-repeat 重新计算所有索引?调用 this.$.list.render() 好像不行。
<template id="list" is="dom-repeat" id="table" items="{{items}}" sort="{{sortFuntion}}">
<template is="dom-if" if="{{isShowItem(index)}}">
[[item.name]]<br />
</template>
</template>
<iron-scroll-threshold scroll-target="document" on-lower-threshold="showMoreData">
</iron-scroll-threshold>
<script>
Polymer({
is: 'my-element',
properties: {
limit: {type: Number, value: 10}
},
isShowItem: function(index) {
return (index < this.limit);
// we only show the items that have an index smaller than "limit"
// (the index is recalculated for each sort or filter, so it works well).
},
showMoreData: function() {
// this is called by iron-scroll-threshold when we scroll down the page
this.set("limit", this.limit + 10);
// this is what doesn't seem to do anything:
// (ideally we want it to recalculate each item's index)
this.$.list.render();
}
});
</script>
我从不在 dom-repeat 中使用 filter
或 sort
,而是在 items
中插入一个方法。然后我就可以控制各种东西了。
<template id="list" is="dom-repeat" id="table" items="[[_filterItems(items, scrollHeight)]]" sort="[[sortFuntion]]">
##code
</template>
---
<script>
Polymer({
## properties and other methods
_filterItems(items, scrollHeight) { // ex. scrollHeight = 100
var interpolationLevel = 5; // px
var minAllowedItems = 10;
var showThisManyItems = scrollHeight / interpolationLevel; // 100 / 5
showThisManyItems (showThisManyItems < minAllowedItems) ? minAllowedItems : showThisManyItems; // 100 / 5 = 20, but min value == 10
return items.filter(item, index) {
return index < showThisManyItems; // show this item if index < 20
}
},
}
</script>
我有一个 dom-repeat,它显示了大量项目(大约 9000 个)。
我试图只显示部分项目,这样我就不会得到一个巨大的滚动条。为此,我使用 dom-if 仅显示索引大于 10 的项目。
当 dom-repeat 被排序或过滤时,每个项目的索引都会重新计算,所以效果很好。
然后我使用 iron-scroll-threshold 来检测用户何时滚动到页面底部,然后我增加显示的项目数。
问题是,这不是重新计算索引 - 换句话说,我不知道如何 "redraw" dom-repeat。
有没有办法强制dom-repeat 重新计算所有索引?调用 this.$.list.render() 好像不行。
<template id="list" is="dom-repeat" id="table" items="{{items}}" sort="{{sortFuntion}}">
<template is="dom-if" if="{{isShowItem(index)}}">
[[item.name]]<br />
</template>
</template>
<iron-scroll-threshold scroll-target="document" on-lower-threshold="showMoreData">
</iron-scroll-threshold>
<script>
Polymer({
is: 'my-element',
properties: {
limit: {type: Number, value: 10}
},
isShowItem: function(index) {
return (index < this.limit);
// we only show the items that have an index smaller than "limit"
// (the index is recalculated for each sort or filter, so it works well).
},
showMoreData: function() {
// this is called by iron-scroll-threshold when we scroll down the page
this.set("limit", this.limit + 10);
// this is what doesn't seem to do anything:
// (ideally we want it to recalculate each item's index)
this.$.list.render();
}
});
</script>
我从不在 dom-repeat 中使用 filter
或 sort
,而是在 items
中插入一个方法。然后我就可以控制各种东西了。
<template id="list" is="dom-repeat" id="table" items="[[_filterItems(items, scrollHeight)]]" sort="[[sortFuntion]]">
##code
</template>
---
<script>
Polymer({
## properties and other methods
_filterItems(items, scrollHeight) { // ex. scrollHeight = 100
var interpolationLevel = 5; // px
var minAllowedItems = 10;
var showThisManyItems = scrollHeight / interpolationLevel; // 100 / 5
showThisManyItems (showThisManyItems < minAllowedItems) ? minAllowedItems : showThisManyItems; // 100 / 5 = 20, but min value == 10
return items.filter(item, index) {
return index < showThisManyItems; // show this item if index < 20
}
},
}
</script>