基于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是正确的放置位置。但是要保持一致!

09-25 17:19
查看更多