会话值应该在Meteor应用程序中的哪个位置启动?

时间:2015-09-08 02:46:37

标签: javascript meteor session-variables single-page-application meteor-blaze

基于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变量&#39; curTemplate&#39;到我要显示的第一个模板,如:

Session.setDefault('curTemplate', 'tblScheduler');

...然后在其他地方动态设置它:

Session.set('curTemplate', somethingElseBasedOnContext);

我的问题是,初始(setDefault)属于哪里?应该是我的main.js,还有Template.body.helpers(我还有我的Meteor.subscribe(&#34; bla&#34;)来电?

1 个答案:

答案 0 :(得分:2)

以下三个位置中的任何一个都可以使用:

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是它的正确位置。但要尽量保持一致!