聚合物:强制dom-repeat重新计算所有项目的索引

时间:2018-03-11 21:03:06

标签: polymer dom-repeat

我有一个dom-repeat,它显示了一个很大的项目列表(大约9000个)。

我试图只显示部分项目,这样我就不会得到一个巨大的滚动条。为此我使用dom - 如果只显示索引大于10的项目。

当对dom-repeat进行排序或过滤时,会重新计算每个项目的索引,因此效果非常好。

然后我使用iron-scroll-threshold检测用户何时滚动到页面底部,然后我增加显示的项目数。

问题是,这不是重新计算索引 - 换句话说,我无法弄清楚如何“重绘”dom-repeat。

有没有办法强制dom-repeat重新计算所有索引?调用它。$ .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>

1 个答案:

答案 0 :(得分:1)

我从未在dom-repeat中使用filtersort,而是在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>