全局模板助手中的会话对象

时间:2015-04-05 19:51:33

标签: meteor

Session.set('coursesReady', false);在启动时。

更新

我把它变成了一个更简单的问题。请考虑以下代码。 在router.js

Router.route('/', function () {
  Meteor.subscribe("courses", function() {
    console.log("data ready")
    Session.set("coursesReady", true);
  });
}

并在主模板Main.js

  Template.Main.rendered = function() {
    if (Session.get('coursesReady')) {
      console.log("inject success");
      Meteor.typeahead.inject();
    }

打印“数据就绪”后,不会打印“注入成功”消息。为什么反应性在这里不起作用?

2 个答案:

答案 0 :(得分:1)

反应性“无效”,因为rendered仅执行一次(它不是被动的)。您需要将会话检查包装在template autorun内,以便重新评估它们:

Template.Main.rendered = function() {
  this.autorun(function() {
    if (Session.get('coursesReady')) {
      console.log("inject success");
      Meteor.typeahead.inject();
    }
  });
};

如果您想在渲染模板之前确保加载数据,可能更好的解决方案是wait on订阅。

Router.route('/', {
  // this template will be rendered until the subscriptions are ready
  loadingTemplate: 'loading',

  waitOn: function () {
    // return one handle, a function, or an array
    return Meteor.subscribe('courses');
  },

  action: function () {
    this.render('Main');
  }
});

现在你的rendered可以这样做了:

Template.Main.rendered = function() {
  Meteor.typeahead.inject();
};

不要忘记添加加载模板。

答案 1 :(得分:0)

解决您的问题

Template.registerHelper("course_data", function() {
    console.log("course_data helper is called");    
    if (Session.get('coursesReady')) {
      var courses = Courses.find().fetch(); 
      var result = [ {                         **Changed**
          name: 'course-info1',
          valueKey: 'titleLong',
          local: function() {
            return Courses.find().fetch();
          },
          template: 'Course'
        }];
        Session.set('courseResult', result);   **New line**
        return Session.get('courseResult');    **New line**
      ,

<强>解释

答案是在返回辅助函数时需要与反应性相关联,以便Blaze(模板渲染器)知道何时重新渲染。

非反应性(随着值的变化,DOM不会发生变化)

Template.Main.helpers({
    course_data: UI._globalHelpers.course_data    ** Not reactive
  });

基本上:UI._globalHelpers.course_data返回一个不被反应的对象数组:

return [
        {
          name: 'course-info1',
          valueKey: 'titleLong',
          local: function() {
            return Courses.find().fetch();
          },
          template: 'Course'
        },

<强>活性

来自Meteor文档: http://docs.meteor.com/#/full/template_helpers

Template.myTemplate.helpers({
  foo: function () {
    return Session.get("foo");   ** Reactive
  }
});

将Session.get函数返回给Blaze是被动的;因此,模板会随着值的变化而变化。