嘗試使用subscriptions
模式代替。
this.route('gamePage', {
path: '/game/:slug/',
subscriptions: function() {
return Meteor.subscribe('singlePlayer', this.params.slug);
},
onBeforeAction: function() {
var singlePlayer = this.data();
if (singlePlayer) {
if (singlePlayer.upgrade) {
this.subscribe('upgrades', this.params.slug);
}
}
this.next();
},
data: function() {
return Games.findOne({slug: this.params.slug});
},
waitOn: function() { return [Meteor.subscribe('singleGame', this.params.slug)]}
});
然而,重要的是你還包括loading
插件採取loadingTemplate
的優勢。
Router.configure({
loadingTemplate: 'loading' // general purpose loading template
});
// built in plugin.. surprisingly not clearly specified in current docs, but you can dive in the code for plugins.
// https://github.com/EventedMind/iron-router/blob/devel/lib/plugins.js
Router.onBeforeAction('loading', { only: ['gamePage'] }); // only show loading for pages with subscriptions
Router.map(function() {
this.route('gamePage',{
//... your other options here ..
loadingTemplate: 'gamePageLoading', // game Page dedicated loading markup.
});
});
另外還有this.ready()
模式,如果你想留在你onBeforeAction
實現。
this.route('gamePage', {
path: '/game/:slug/',
onBeforeAction: [function() {
this.subscribe('singlePlayer', this.params.slug);
if(this.ready()) {
var singlePlayer = this.data();
if (singlePlayer) {
if (singlePlayer.upgrade) {
this.subscribe('upgrades', this.params.slug);
}
}
this.next();
} else {
this.render('loading');
}
}],
data: function() {
return Games.findOne({slug: this.params.slug});
},
waitOn: function() { return [Meteor.subscribe('singleGame', this.params.slug)]}
});
來源:https://github.com/EventedMind/iron-router/blob/devel/Guide.md#subscriptions
我想,因爲.wait
圖案被看作是不必要的鏈接這種變化是必要的,很容易出現(編碼)錯誤。此外,當重寫onBeforeAction
時,明確處理.next()
現在確保此掛鉤的正確時間(並且可能大部分,如果不是全部其他掛鉤)。
什麼版本的鐵路由器?另外:爲什麼在'onBeforeAction'回調周圍使用數組(方括號)括號?我以前沒有看過這種語法。不過,我只使用了鐵路路由器0.9.4。 – 2014-11-10 01:13:19