基于Dan Dascalescu的回答here,我想像这样在Meteor中实现动态模板:
在main.html中:
<body TEXT="#000000">
<div class="container">
{{> mnuScheduler}}
{{> Template.dynamic template=currentTemplate}}
</div>
</body>
在main.js中:
Template.body.helpers({
currentTemplate: function () {
return Session.get('curTemplate');
}
});
但是显然我需要将Session变量'curTemplate'初始化为要显示的第一个模板,例如:
Session.setDefault('curTemplate', 'tblScheduler');
...然后像这样在其他地方动态设置它:
Session.set('curTemplate', somethingElseBasedOnContext);
我的问题是,初始(setDefault)属于哪里?应该是我main.js以及Template.body.helpers(在这里我也有Meteor.subscribe(“ bla”)调用)?
最佳答案
以下三个位置均可使用:
if (Meteor.isClient) {
Session.set('curTemplate', 'tblScheduler'); // <---
console.log('Meteor.isClient');
Meteor.startup(function() {
//Session.set('curTemplate', 'tblScheduler') // <---
console.log('Meteor.startup');
});
Template.body.onCreated(function() {
//Session.set('curTemplate', 'tblScheduler') // <---
console.log('Template.body.onCreated');
});
Template.body.helpers({
currentTemplate: function() {
return Session.get('curTemplate');
},
});
}
使用此代码,浏览器日志显示启动时调用它们的顺序:
Meteor.isClient
Template.body.onCreated
Meteor.startup
Meteor.startup直到DOM准备就绪后才会运行,但是在这种情况下这不是一个因素。
Meteor在构建应用程序方面非常灵活,因此最好保持一致。
在这里,您可以确定启动代码位于Meteor.startup块中,或者可以决定渲染主体模板所需的模板,Template.body.onCreated是正确的放置位置。但是要保持一致!