0

我有以下路线:

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 时订阅还没有准备好,不是吗?请提示。谢谢。

4

2 回答 2

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);
    }
  ]
});
于 2016-04-15T16:18:39.673 回答
0

数据函数不会等待订阅准备好。此外,路由器中的订阅在很大程度上被认为是一种反模式,应该在模板中完成:https ://www.discovermeteor.com/blog/template-level-subscriptions/

我会将 groupId 传递给模板,然后在模板中获取组和成员,如下所示:

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

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

然后在模板文件中:

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}});

  })
})
于 2016-04-15T15:12:57.823 回答