路由器级别上的流星集合查找

时间:2014-12-07 22:07:34

标签: meteor iron-router

我正在构建一个包含页面版本的应用。我希望用户能够访问该页面而无需指定他们希望开始使用的版本。如果URL中未指定版本,我想查找该页面的最新版本并重定向到该页面。

我遇到的问题是,我无法在路由器级别进行任何收集查找,以确定我正在寻找的版本,因为收藏品根本就不存在。

到目前为止,这是我的代码:

Router.route('page', {
    path: '/page/:slug/:version?',
    onBeforeAction: function() {
        var versionId = this.params.version;

        if (!versionId) {
            console.log('no version! oh noes!');

            var p = Pages.find({slug: this.params.slug});
            var newestVersion = Versions.findOne({page: p._id}, {sort: {createdAt: -1}});
            versionId = newestVersion._id;

            Router.redirect('page', this.params.slug, versionId);
        }

        this.next();
    },
    waitOn: function() {
        return Meteor.subscribe('page', this.params.slug, this.params.state);
    },
    data: function() {
        return {
            page: Pages.findOne({slug: this.params.slug}),
            version: Versions.findOne(this.params.version)
        }
    }
});

非常感谢任何帮助或见解!

1 个答案:

答案 0 :(得分:0)

这是我找到的解决方案。问题是onBeforeAction实际上并没有等待waitOn,除非你告诉它。

onBeforeAction: function() { 
    if (this.ready()) { 
        if (!this.params.version) { 
            var p = Pages.findOne({slug: this.params.slug}), 
                sortedVersions = _.sortBy(Versions.find({page: p._id}).fetch(), function(s) { 
                    return v.createdAt; 
                });

            var newest_version_id = sortedVersions[0]._id;
            this.redirect('page', {slug: this.params.slug, state: newest_version_id});
        }

        this.next();
    }
}

我认为关键是在this.ready()检查中,只有当waitOn中的所有订阅都为真时才会生效。我假设所有这些都是通过简单地使用waitOn自动完成的。