我有这段代码:
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的解决方案也很好。
答案 0 :(得分:2)
是的,rendered
回调在最初呈现模板时为only fired once,而不是由于计算依赖于其无效而发生变化。
Meteoric做事的方法是在渲染的回调中添加this.autorun
,这取决于导致模板重新渲染的相同事情(即find
上的Videos
{1}}收集,或其他)。那样你就是:
autorun
。)autorun
在this
下被解除的{{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!")
}