我在哪里设置会话默认值,以便在我的订阅中可用?

时间:2015-05-21 20:03:44

标签: meteor

我有一个辅助函数,它依赖于集合文档查找,其结果通过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一旦它得到正确的值。

我也尝试过我的订阅,从waitOnsubscriptions再到onAfterAction再到onRendered,但这些尝试完全无效。

我该怎么办?

2 个答案:

答案 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