我想在请求的艺术家不可用时设置Session
变量(artistNotAvailable
)。不幸的是,该路由不起作用,因为它没有等待onBeforeAction
挂钩中的订阅数据。 artistAvail
和artist
未定义,但不是因为数据库中没有艺术家,我认为这是订阅问题。我调试了它,并在浏览器控制台中调用Artists.find().fetch();
返回undefined
。
这是我的路线:
this.route('eventPage', {
path: '/event/:slug/:openDate?/:closeDate?',
onBeforeAction: [teamFilter, function() {
var event = this.data();
if (event.outdoor) {
this.subscribe('artists', this.params.slug);
if (this.ready()) {
var artistAvail = Artists.findOne({eventId: event._id, openDate: moment(this.params.openDate).toDate(), closeDate: moment(this.params.closeDate).toDate()});
if ((!this.params.openDate && !this.params.closeDate) || typeof artistAvail === "undefined") {
var artist = Artists.findOne({
eventId: event._id,
openDate: {$lte: new Date()},
closeDate: {$gte: new Date()}
});
if (Artists.find().count() > 0 && artist) {
Session.set('artistNotAvailable', true);
this.redirect('eventPage', {
slug: this.params.slug,
openDate: moment(artist.openDate).format('YYYY-MM-DD'),
closeDate: moment(artist.closeDate).format('YYYY-MM-DD')
});
} else {
Session.set('noArtists', true);
this.redirect('overviewPage', {slug: this.params.slug});
}
} else {
this.subscribe('musicOutdoor', this.params.slug, moment(this.params.openDate).toDate(), moment(this.params.closeDate).toDate());
if (this.ready()) {
var guestsIds = new Array();
Guests.find({artistId: artistAvail._id}).forEach(function (guest) {
guestIds.push(guest._id);
});
this.subscribe('guestsOutdoor', guestIds);
} else {
this.render('loading');
}
}
} else {
this.render('loading');
}
} else {
this.subscribe('musicIndoor', this.params.slug);
this.subscribe('guestsIndoor', this.params.slug);
if (!this.ready()) {
this.render('loading');
}
this.next();
}
this.next();
}],
waitOn: function() { return [Meteor.subscribe('singleEvent', this.params.slug)]; },
data: function() {
return Events.findOne({slug: this.params.slug});
}
});
订阅:
Meteor.publish('artists', function(slug) {
var event = Events.findOne({slug: slug});
if (event) {
return Artists.find({eventId: event._id});
} else {
return null;
}
});
现在的问题是,当我使用错误的eventPage
或openDate
访问closeDate
时,我将被重定向到overviewPage
,即使有艺术家D b。如前所述,我调试了它,似乎this.ready()
无效。
我真的很想念.wait()
: - (
非常感谢任何帮助。
答案 0 :(得分:4)
铁路由器工作正常。
this.subscribe 就像 Meteor.subscribe 一样,Iron-Router也不会等待。
是 onBeforeAction有几种方法可以做你想要的事情
答案 1 :(得分:0)
它帮助我等待数据功能中的订阅(直到订阅准备就绪),如下所示:
Router.route('/:_id', {
name: 'show',
template: 'show',
waitOn: function () {
var id = this.params._id;
return Meteor.subscribe('something', id, {});
},
data: function () {
if (this.ready()) {
var id = this.params._id;
var data = Somethings.findOne({_id: id});
return data;
}
}
});