我正在构建一个包含页面版本的应用。我希望用户能够访问该页面而无需指定他们希望开始使用的版本。如果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)
}
}
});
非常感谢任何帮助或见解!
答案 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自动完成的。