2016-04-15 6 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}}); дает мне ошибку: undefined object не имеет свойства 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, неправильно, если маршрутизатор = я –

+0

@MichelFloyd Нету, все еще антишаблоном с iron-router – 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); 
    } 
    ] 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^