我是一个名为Tabs的集合和一个以tabId作为其路由参数的动态路由。标签具有布尔属性'已发布'并且我想将用户重定向回根网址,如果他们访问了相应标签记录已发布的路线#' 39;是假的。
为了做到这一点,我想我可以在onBeforeAction中获取记录并检查它,但是由于某种原因未定义从订阅返回的游标。
路线:
viewTabController = RouteController.extend({
layoutTemplate: 'storeLayout',
subscriptions: function() {
var tabId = this.params.tabId;
var sourceId = readCookie(Purchases.COOKIE_IDENTIFIER(tabId));
this.sub = Meteor.subscribe("itemData", tabId, sourceId);
},
data: function() {
var tabId = this.params.tabId;
return {
tab: Tabs.findOne(tabId),
ready: this.sub.ready
};
},
onBeforeAction: function() {
if (this.sub.ready) {
var tab = Tabs.findOne(); <------------ undefined
var purchase = Purchases.findOne(); <-------------- undefined
console.log(tab, purchase);
if (!_.isUndefined(purchase)) {
console.log('go receipt');
// Router.go('receipt', { purchaseId: purchase._id });
} else if (!tab.isPublished()) {
console.log('is not Published');
} else {
console.log('view tab');
}
}
this.next();
},
onAfterAction: function() {
SEO.set({
title: 'View Tab | ' + SEO.settings.title
});
},
fastRender: true
});
Router.route('viewTab', {
path: '/tabs/:tabId',
controller: viewTabController
});
使用publishComposite发布:
/*
* Returns tab matching ID
*/
Meteor.publishComposite("itemData", function(tabId, sourceId) {
check(tabId, String);
return {
find: function() {
return Tabs.find({ _id: tabId }, { fields: { downloadUrl: 0, s3key: 0, createdAt: 0 } });
},
children: [
{
find: function(tab) {
return Users.find({ _id: tab.userId }, { fields: { username: 1 } });
}
},
{
find: function(tab) {
return Purchases.find({ tabId: tabId, sourceId: sourceId });
}
}
]
};
});
这是错误的做法还是我错过了什么?
答案 0 :(得分:0)
这可能不是答案,但我希望它会有所帮助。
问题在于Tabs&amp;当它应该被使用时,Purchases.FindOne()还没有准备好,please read this great post for clarification。