Meteor - iron-router不在onBeforeAction钩子上等待订阅数据

时间:2014-11-14 22:31:10

标签: javascript meteor iron-router

我想在请求的艺术家不可用时设置Session变量(artistNotAvailable)。不幸的是,该路由不起作用,因为它没有等待onBeforeAction挂钩中的订阅数据。 artistAvailartist未定义,但不是因为数据库中没有艺术家,我认为这是订阅问题。我调试了它,并在浏览器控制台中调用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;
    }
}); 

现在的问题是,当我使用错误的eventPageopenDate访问closeDate时,我将被重定向到overviewPage,即使有艺术家D b。如前所述,我调试了它,似乎this.ready()无效。 我真的很想念.wait(): - (

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

铁路由器工作正常。

this.subscribe 就像 Meteor.subscribe 一样,Iron-Router也不会等待。

onBeforeAction

有几种方法可以做你想要的事情

  • 你可以像CodeChimp所说的那样使用模板和create / destroyed
  • 您可以在不同的路线中拆分路线,以便在需要时重定向
  • 您可以使用铁路由器here的新API中的 .wait()

答案 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;
        }
    }
});