在 Meteor 应用程序中应该在哪里启动会话值?

Where should Session values be initiated in a Meteor app?

根据 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');
  }
});

但显然我需要将会话变量 '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 是它的正确位置。但尽量保持一致!