在dom-repeat中更改数据时强制重新呈现整个模板

时间:2016-12-13 18:07:19

标签: javascript dom polymer-1.0

我在聚合物中有这个dom-repeat模板

<template is="dom-if" if="true">
    <typeahead items="{{item.children}}"></typeahead>
</template>

<template is="dom-repeat" id="level" items="{{item.children}}">
  <li on-click="itemClickHandler" id$="[[getItemId(item)]]" class$="{{isItemSelected(item, selectedItem)}}" >
  <template is="dom-if" if="[[!toShowColumnTypeahead()]]"><span>{{getItemLabel(item)}}</span></template>
    <template is="dom-if" if="[[toShowColumnTypeahead()]]">
      <template is="dom-if" if="[[!item.searchTerm]]" restamp="true">
        <span class="f">{{getItemLabel(item)}}</span>
      </template>
      <template is="dom-if" if="{{item.searchTerm}}" restamp="true">
        <span class="">{{item.currentSearchLabel.prefix}}<span class="bold">{{item.currentSearchLabel.highlight}}</span>{{item.currentSearchLabel.suffix}}</span>
      </template>
    </template>
    <button class$="[[getItemOpenerClass(item)]]" on-click="openClickHandler" key$="[[getItemId(item)]]">Open</button>
    <template is="dom-if" if="{{_hasChildren(item, showChevron)}}">
      <span class="chevron"><i class="fa fa-angle-right"></i></span>
    </template>
  </li>
</template>

item.children的数据正在从先行聚合物组件变为通知它。但是,如果items.children被修改并且仍然是之前结果的一部分,那么它是not redrawn on domI want it to be redrawn on DOM every time列表中有任何更改,无论它是否是先前更改的一部分。现在Polymer只重绘DOM上更改的元素。我通过this.setmanually calling the renderquery selecting the template方法从网上尝试了很多东西。

1 个答案:

答案 0 :(得分:0)

我不完全确定我会100%跟踪你,但你可以尝试在dom-repeat上使用restamp,强制它在每次更改item.children时销毁并重新创建元素。 忽略这一点,restamp实际上只适用于dom-if

渲染将同步强制渲染通常异步完成的更改,但它只会获取通过Polymer API进行的更改,因此您可能希望确保对您的item.children所做的更改是通过Polymer API进行的而不只是本机数组函数(即设置它应该在this.push('theArray',newItem)的行上做的事情,而不是通常的theArray.push(newItem))。

编辑:进一步澄清:

  • 调用渲染“只是”强制同步重新渲染更改,但这不应该强制渲染比通常的异步渲染更多的东西
  • 您的问题可能来自数组的更新方式。使用this.splicethis.pushthis.popthis.unshiftthis.shift来改变您的数组。 Link to the doc