我有一个更改DOM的模板,我想在保存到数据库时重新呈现模板。在Blaze之前,如果模板中某处存在反应变量,Meteor会重新呈现整个模板,但现在我该怎么做?
我在Iron路由器路由中设置了剪辑的集合:
ClipsController = RouteController.extend({
data: function() {
clips = Clips.find({}, {sort: {created: 1}});
return {clips: clips};
}
});
剪辑的模板:
<template name="clips">
{{#each clips}}
{{> clip}}
{{/each}}
</template>
然后,我有 clip 的模板:
<template name="clip">
<article class="clip" id="{{_id}}">
{{{content}}}
<ul class="tags">
{{#each tags}}
<li><a href="/#{{this}}">#{{this}}</a></li>
{{/each}}
</ul>
</article>
</template>
此模板的脚本更改DOM,然后保存剪辑:
Template.clip.events({
'click .edit': function(event, template) {
template.$('.tags li').each(function() {
$(this).text($(this).text().replace(/^#(.*)/, "$1"));
});
},
'click .save': function(event, template) {
var data = {
//...
};
Clips.update({_id: this._id}, data);
// How to rerender the template ?
}
});
答案 0 :(得分:12)
我不相信Blaze提供任何方式来重新渲染整个模板,因为Blaze的目标是进行细粒度的更新。
实现这一目标的快速而肮脏的方法可能是使用Session,模板帮助器和包装整个模板的{{#unless}}块,然后在更新之前将Session键设置为true,之后将false设置为false导致{{#unless}}块中的所有内容重新呈现。
Template.clips.noRender = function(){
return Session.get("noRender");
}
Template.clip.events({
'click .edit': function(event, template) {
template.$('.tags li').each(function() {
$(this).text($(this).text().replace(/^#(.*)/, "$1"));
});
},
'click .save': function(event, template) {
var data = {
//...
};
Session.set("noRender", true);
Clips.update({_id: this._id}, data, function(){
Session.set("noRender", false);
});
// How to rerender the template ?
}
});
<template name="clips">
{{#unless noRender}}
{{#each clips}}
{{> clip}}
{{/each}}
{{/unless}}
</template>
答案 1 :(得分:1)
Blaze提供了一种简单的方法:
var template = Template.instance();
var parentDom = /*where to put your Template*/;
Blaze.remove(template.view);
Blaze.render(Template.clips, parentDom);
它的作用是删除无效模板并将新模板呈现为子模板。
http://docs.meteor.com/#/full/blaze_remove
http://docs.meteor.com/#/full/blaze_render
答案 2 :(得分:1)
我认为这也可能是流星方式的更好解决方案。
../clips.js
Template.clips.onRendered(function(){
this.autorun(function(){
Template.currentData();
});
});
template.autorun(runFunc)
您可以使用onCreated或onRendered回调中的this.autorun 反应性地更新DOM或模板实例。您可以使用 Template.currentData()在此回调内部访问被动数据 模板实例的上下文。
答案 3 :(得分:0)
铁路由器数据操作是被动默认的。
clips = Clips.find({}, {sort: {created: 1}});
替换为
clips = Clips.find({}, {sort: {created: 1}}).fetch();
答案 4 :(得分:0)
我认为更好的方法是使用Tracker.afterFlush
。
例如:
Tracker.autorun ->
Tracker.afterFlush ->
# DOM is updated, why don't you do something here?