Meteorjs:如何知道模板是否重新渲染?

时间:2014-12-16 11:41:03

标签: templates dom meteor rerender

我有这段代码:

Template.temp.rendered = function () {
    console.log('temp rendered');
}

仅在网站初始化时记录。

但我这样做:

more = function () {
    Meteor.subscribe('Videos', Session.get('more_info'));
}

当我打电话给更多();即使模板dom使用新文档更新,它也不会记录“临时渲染”。 还试过像:

Template.temp.rerendered = function () {
    console.log('temp re rendered');
}

它不起作用; 我怎么知道A模板是否被重新渲染?

目前我正在做这样的事情

$('#list').bind("DOMSubtreeModified",function(){
    console.log('template modified'}
    //this logs like 200 times, every time the template is re rendered
)

我怎么能以流星的方式做到?

列表模板:

<template name="list">
    {{#each list}}
        <a id="{{_id}}" href="/{{category}}/{{_id}}" title="{{vTitle}}">
            {{vTitle}}
        </a>
    {{/each}}
</template>

助手:

Template.list.helpers({
  list : function () {
     return Videos.find({},{sort : {date : -1}});
  }
})

尝试过(不工作):

Template.list.rendered = function () {    
  this.autorun(function() {
    Videos.find();
    console.log('template re rendered');
  });
}

首选解决方案(来自@richsilv):

Template.list.rendered = function () {    
  this.autorun(function() {
    Videos.find().count();
    console.log('template re rendered');
  });
}

如果您需要在每次渲染模板时调用函数并且您不想注册自动运行,@ Peppe L-G的解决方案也很好。

2 个答案:

答案 0 :(得分:2)

是的,rendered回调在最初呈现模板时为only fired once,而不是由于计算依赖于其无效而发生变化。

Meteoric做事的方法是在渲染的回调中添加this.autorun,这取决于导致模板重新渲染的相同事情(即find上的Videos {1}}收集,或其他)。那样你就是:

  1. 将您对数据源的反应性与DOM相关联,除了从概念角度来说更明智之外,还意味着每当模板发生任何变化时,您都不会进行大量不必要的计算,如果它依赖于多个数据源,则非常重要(如果需要,您可以为每个源提供不同的autorun。)
  2. 仍然利用模板的功能来阻止autorunthis下被解除的{{1}}块,这样就无需手动停止它们以避免有大量浮动,未使用的自动运行器占用CPU和内存。

答案 1 :(得分:1)

从Blaze(Meteor 0.8.0)开始,模板永远不会被重新渲染。而是使用细粒度更新。如果您需要知道模板的一部分何时发生更改,请尝试将该部件放入另一个模板中,并使用该模板的渲染功能。例如,如果您有以下模板:

<template name="myTemplate">
    {{#if reactiveCondition}}
        <p>The reactive condition is true!</p>
    {{/if}}
</template>

你想要在渲染段落时发生一些事情,你需要做这样的事情:

<template name="myTemplate">
    {{#if reactiveCondition}}
        {{> paragraph}}
    {{/if}}
</template>
<template name="paragraph">
    <p>The reactive condition is true!</p>
</template>
Template.paragraph.rendered = function(){
    console.log("The paragraph rendered!")
}

同样的原则可以应用于游标。例如,以下模板:

<template name="myTemplate">
    {{#each getCursor}}
        <p>A document in the cursor!</p>
    {{/each}}
</template>

必须写成:

<template name="myTemplate">
    {{#each getCursor}}
        {{> document}}
    {{/each}}
</template>
<template name="document">
    <p>A document in the cursor!</p>
</template>
Template.document.rendered = function(){
    console.log("A document is rendered!")
}