我想根据文档(mode
)中的布尔属性来决定用户获得的订阅,但我遇到了设计方法的问题。如果我在this.data()
函数中使用waitOn
和if子句,我将获得404页面,因为我首先需要订阅。
这是我的代码:
this.route('gamePage', {
path: '/game/:slug/viewGame/:produceDate?/:releaseDate?',
onBeforeAction: [memberFilter],
waitOn: function() {
var game = this.data();
if (game.mode) {
if (this.params.produceDate && this.params.releaseDate) {
return [Meteor.subscribe('singleGame', this.params.slug),
Meteor.subscribe('authorsMode', this.params.slug, this.params.produceDate, this.params.releaseDate)];
} else {
return [Meteor.subscribe('singleGame', this.params.slug), Meteor.subscribe('console', this.params.slug)];
}
} else {
return [Meteor.subscribe('singleGame', this.params.slug),
Meteor.subscribe('authors', this.params.slug)];
}
},
data: function() {
return Games.findOne({slug: this.params.slug});
}
非常感谢任何帮助。
答案 0 :(得分:1)
要直接实现这一点,您需要Iron Router让您拥有2个级别的订阅,第一个级别使数据可用于下一级订阅。此功能现在不存在。我刚刚向IR repo提交了issue,要求提供此功能。
解决方法是针对每种情况使用不同的URL,进行中间重定向:
this.route('gamePage', {
path: '/game/:slug/viewGame/:produceDate?/:releaseDate?',
onBeforeAction: function() {
var game = this.data();
var params = {
slug: this.params.slug,
produceDate: this.params.produceDate,
releaseDate: this.params.releaseDate
}
if (game.mode) {
if (this.params.produceDate && this.params.releaseDate) {
this.redirect('gamePageOption1', params);
} else {
this.redirect('gamePageOption2', params);
}
} else {
this.redirect('gamePageOption3', params);
}
},
waitOn: function() {
return [Meteor.subscribe('games')];
},
data: function() {
return Games.findOne({slug: this.params.slug});
}
}
如果您使用的是IR v< 0.9.3了解有关中间重定向的问题:ref1,ref2。如果是这种情况,则必须在Meteor.defer
:
Meteor.defer(function() {
this.redirect(...)
})