我有一个辅助函数,它依赖于集合文档查找,其结果通过Session传递给订阅。然后,它需要从 订阅查询文档。
代码解释得比我好。
辅助:
var selection = Selections.findOne()
var itemIds = function() {
return selection && selection.itemIds
}
var itemIdsArray = itemIds()
Session.set('itemIdsArray', itemIdsArray)
console.log(Session.get('itemIdsArray'))
_.each(Items.find({_id: {$in: itemIdsArray}}).fetch(), function(element, index, list) {
//doing stuff
})
订阅:
Meteor.subscribe('itemsById', Session.get('itemIdsArray'))
公开:
Meteor.publish('itemsById', function(itemIdsArray) {
return Items.find({_id: {$in: itemIdsArray}})
})
我的console.log
在返回ID数组之前返回undefined
值。因此,undefined
一直传递到出版物,该出版物在null
之后抱怨$in
值(这本身就很奇怪)并且会中断。
我的解决方案是将会话设置为默认为[]
,
Session.setDefault(`itemIdsArray`, [])
我真的很希望它有效,但唉,它没有。
我已经尝试将它放在IronRouter的onBeforeAction
中,我已经尝试将它放在帮助器的顶部,我已经尝试将它放在任何地方,但它仍然记录并返回undefined
一旦它得到正确的值。
我也尝试过我的订阅,从waitOn
到subscriptions
再到onAfterAction
再到onRendered
,但这些尝试完全无效。
我该怎么办?
答案 0 :(得分:1)
如果您在Iron Router的waitOn选项中返回订阅,则应该在模板中包含数据:
Router.route('/yourRoutePath/:_id', {
// this template will be rendered until the subscriptions are ready
loadingTemplate: 'loading',
waitOn: function () {
// return one handle, a function, or an array
return Meteor.subscribe('itemsById', this.params._id);
},
action: function () {
this.render('myTemplate');
}
});
您的模板助手:
Template.myTemplate.helpers({
items: function() {
return Items.find();
}
});
我注意到您发布了Items集合,并且希望在帮助程序中使用Selections集合。如果您需要多个订阅,则可以在waitOn中返回订阅数组:
waitOn: function () {
// return one handle, a function, or an array
return [
Meteor.subscribe('itemsById', this.params._id),
Meteor.subscribe('selections')
];
}
WaitOn确保在所有订阅准备就绪时呈现您的模板。
答案 1 :(得分:1)
这是Meteor中相当典型的行为。会话变量当时并不总是准备就绪。解决这个问题的常用方法是在帮助程序中引入一个保护程序,用于在对其进行任何其他操作之前检查变量。
在你的情况下,这样的事情可行:itemsIdArray = itemIds() || [];
要回答您要问的实际问题,您在哪里设置订阅中可用的会话默认值:在设置它们的位置并不重要,但是当您访问它们时。您可以使用iron router的waitOn()函数等待订阅准备就绪,或者您可以检查订阅句柄的ready()函数(请参阅https://github.com/oortcloud/unofficial-meteor-faq#user-content-how-do-i-know-when-my-subscription-is-ready-and-not-still-loading)