这对我来说有点令人费解。我在路由器中设置数据(我在项目的这个阶段非常简单地使用它),如下所示:
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);
};
我喜欢理解为什么(假设它是预期的结果),或者如果我正在做/不做的事情会导致这种情况?
答案 0 :(得分:1)
我今天亲自体验过这一点。我相信Template.rendered回调和铁路由器数据功能之间存在竞争条件。 I have since raised a question as an IronRouter issue on github处理核心问题。
Template.groupPage.rendered = function() {
var data_context = this.data;
window.setTimeout(function() {
console.log(data_context);
}, 100);
};
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
];
},
});