2016-04-15 43 views
0

我有以下途徑:如何waitOn數據準備好使用鐵路由器和發佈複合

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時,訂閱還沒有準備好,不是嗎?請提示。 謝謝。

回答

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

    }) 
}) 
+0

你說的沒錯,如果路由器== flowRouter,錯的,如果路由器= IR –

+0

@MichelFloyd沒了,還反模式與鐵路由器 – climbinghobo

+0

他使用'waitOn'。這與'subscribe'和'data'一起都是[記錄](http://iron-meteor.github.io/iron-router/#route-specific-options),在i-r中很常用。 –

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); 
    } 
    ] 
}); 
相關問題