流星:检测最后{{> template}}在{{#each}}中完成渲染

时间:2016-02-25 07:45:26

标签: meteor jquery-masonry meteor-blaze

编辑:已在答案中发布了一般解决方案!

我目前正在使用Masonry来定位一些{{> card}}模板。

{{#each searchResults}}
  {{> card}}
{{/each}}

{{searchResults}}会返回Session.get("searchResults"),这会在新搜索时发生变化。然后,该页面将使用新的{{> card}}模板重新呈现。

我无法在正确的时间让我的砖石开火:

Template.search.onRendered(function(){
  this.autorun(function(){
    var tracking = Session.get("searchResults");
    // ...masonry code here...
  })
});

目前,砌体代码在Session.get("searchResults")更改后立即触发,但在{{> card}}模板呈现或存在之前。实际上,砌体定位零元素,然后元素被渲染(并保持在错误的位置)。

更新了问题:如何更新上一个{{> card}}模板时如何调用砖石?(注意:我可以将onRendered附加到卡片模板上,但onRendered仅在卡片发生时触发首次创建,而不是更新时)

1 个答案:

答案 0 :(得分:1)

一般说明:

  1. 在对象数组中,标记lastItem属性设置为true的最后一项。
  2. 在HTML中,为每个数组对象呈现{{> template}}
  3. 使用onRendered查找lastItem属性。
  4. 如果存在,则已到达最后一个元素!
  5. 我的代码示例:

    标记数组中的最后一项:

    cards[cards.length - 1].lastItem = true;
    

    添加返回数组的助手:

    Template.search.helpers({
      cards: function(){
        return cards;
      }
    }
    

    在搜索模板中,为每个对象渲染模板:

    {{#each cards}}
        {{> card}}
    {{/each}}
    

    使用onRendered检测最后一项。

    Template.card.onRendered(function(){
      if(this.data.lastItem){
        //run masonry code here!
      }
    });