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 に答える