【问题标题】:how to waitOn data ready using iron-router and publish-composite如何使用 Iron-router 和 publish-composite 等待数据准备就绪
【发布时间】:2016-04-16 00:18:39
【问题描述】:

我有以下路线:

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.成员ID}});给我错误:未定义的对象没有 memberIds 属性。我想这是因为在进行 group.memberIds 时订阅还没有准备好,不是吗?请提示。 谢谢。

【问题讨论】:

    标签: meteor undefined iron-router meteor-publications


    【解决方案1】:

    数据函数不会等待订阅准备好。此外,路由器中的订阅在很大程度上被认为是一种反模式,应该在模板中完成: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}});
    
      })
    })
    

    【讨论】:

    • 如果 router == flowRouter 是对的,如果 router = i-r 是错的
    • @MichelFloyd 不,仍然是铁路由器的反模式
    • 他正在使用waitOn。这与subscribe 和data 一起都是documented 并且在i-r 中非常常用。
    【解决方案2】:

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

    • 没有您使用的_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);
        }
      ]
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2020-12-06
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多