如何使用iron-router和publish-composite等待数据准备就绪

时间:2016-04-15 12:39:52

标签: meteor undefined iron-router meteor-publications

我有以下路线:

this.route('groupPage', {
path: '/group/:_groupId',
waitOn: function(){
return Meteor.subscribe("groupPage", this.params._groupId);
},
data: function() {
var group = Groups.findOne({_id: this.params._groupId});

var members = Meteor.users.find({_id : {$in: group.memberIds}}); ******** ISSUE HERE******

return {
group: group,
members: members,

}; }});

以及以下出版物:

Meteor.publishComposite('groupPage', function(groupId, sortOrder,    limit) {
return {
// return the group
find: function() {

    if(this.userId){
      var selector = {_id: groupId};
      var options = {limit: 1};

      return  Groups.find(selector, options);
    }
    else{
      return ;
    }
 },


children: [


    {  // return the members
      find: function(group) {

          var selector = {_id: {$in: group.memberIds} };
          return Meteor.users.find(selector);
      }
    }
 ]}}) ;

现在我的问题是:当相关页面呈现第一个时没有问题,但是当我实现组页面视图时,行:var members = Meteor.users.find({_ id:{$ in:group。 memberIds}});给我错误:未定义的对象没有memberIds属性。我想这是因为在进行group.memberIds时订阅还没有准备好,不是吗?请提示一下。 感谢。

2 个答案:

答案 0 :(得分:0)

The data function doesn't wait for the subscription to be ready. Further more, subscriptions in the router are considered an anti-pattern for the most part, and should be done in the template: https://www.discovermeteor.com/blog/template-level-subscriptions/

I would pass to the template the groupId, and then get the group and members in the template, like so:

this.route('groupPage', {
  path: '/group/:_groupId',

  data: function() {
    return {
      _groupId: this.params._groupId,
    }
  }
});

and then in the template file:

Template.groupPage.onCreated(function(){
  this.subscribe("groupPage", this.data._groupId);
})

Template.groupPage.helpers({
  members(function(){
   tempInst = Template.instance()
   var group = Groups.findOne({_id: tempInst.data._groupId});
   return Meteor.users.find({_id : {$in: group.memberIds}});

  })
})

答案 1 :(得分:0)

您的路线和出版物的一般模式都是可靠的。我怀疑它很简单,例如:

  • 您正在使用的_id没有
  • 您在加载路线时未登录

这是您的代码版本,可以防止错误。请注意,如果用户未登录,则发布将执行this.ready(),而不是仅返回。

this.route('groupPage', {
  path: '/group/:_groupId',
  waitOn: function(){
    return Meteor.subscribe("groupPage", this.params._groupId);
  },
  data: function() {
    var group = Groups.findOne({_id: this.params._groupId});
    var members = group && Meteor.users.find({_id : {$in: group.memberIds}});     
    return { group: group, members: members };
  }
});

Meteor.publishComposite('groupPage', function(groupId,sortOrder,limit) {
  return {
    find: function() {
      if (this.userId) return Groups.find(groupId);
      this.ready()
    }
  },

  children: [
    find: function(group) {
      var selector = {_id: {$in: group.memberIds} };
      return Meteor.users.find(selector);
    }
  ]
});
相关问题