为什么使用Meteor Iron Router设置的数据在模板渲染回调中不可用?

时间:2014-12-21 21:38:41

标签: meteor iron-router meteor-blaze

这对我来说有点令人费解。我在路由器中设置数据(我在项目的这个阶段非常简单地使用它),如下所示:

Router.route('/groups/:_id',function() {
    this.render('groupPage', {
        data : function() {
            return Groups.findOne({_id : this.params._id});
        }
    }, { sort : {time: -1} } );
});

您期望的数据现在可以在模板助手中找到,但如果我看一下这个'这个'在渲染函数中null

Template.groupPage.rendered = function() {
    console.log(this);
};

我喜欢理解为什么(假设它是预期的结果),或者如果我正在做/不做的事情会导致这种情况?

2 个答案:

答案 0 :(得分:1)

问题

我今天亲自体验过这一点。我相信Template.rendered回调和铁路由器数据功能之间存在竞争条件。 I have since raised a question as an IronRouter issue on github处理核心问题。

与此同时,解决方法:

选项1:将代码包装在window.setTimeout()

Template.groupPage.rendered = function() {
    var data_context = this.data;
    window.setTimeout(function() {
        console.log(data_context);
    }, 100);
};

选项2:将您的代码包装在this.autorun()

Template.groupPage.rendered = function() {
    var data_context = this.data;
    this.autorun(function() {
        console.log(data_context);
    });
};

注意:在此选项中,每次模板的数据上下文发生变化时,该函数都会运行!与Tracker.autorun调用不同,自动运行将与模板一起销毁。

答案 1 :(得分:1)

根据我的经验,这并不罕见。以下是我在路线中处理的方式。

根据我的理解,模板在客户端订阅时呈现客户端,因此null实际上是可用的数据。

一旦客户端从订阅(服务器)收到数据,它就会被添加到集合中,从而导致模板重新呈现。

以下是我用于路线的模式。请注意处理无数据情况的if(!this.ready()) return;

Router.route('landing', {
  path: '/b/:b/:brandId/:template',
  onAfterAction: function() {
    if (this.title) document.title = this.title;
  },
  data: function() {
    if(!this.ready()) return;
    var brand = Brands.findOne(this.params.brandId);
    if (!brand) return false;
    this.title = brand.title;
    return brand;
  },
  waitOn: function() {
    return [
      Meteor.subscribe('landingPageByBrandId', this.params.brandId),
      Meteor.subscribe('myProfile'),  // For verification
    ];
  },
});