Meteor / Iron路由器:如何等待依赖于其他数据的数据

时间:2014-05-16 15:11:18

标签: javascript meteor iron-router

我的情况最好用以下代码描述:

Meteor.publish('users', function (name) {
  return Users.find({name: name});
});


Meteor.publish('posts', function (userId) {
  return Posts.find({userId: userId}, {sort: {insertDate: 1}});
});

用户有很多帖子。所以,当网址是

http://example.com/john

因此,要查找特定用户的帖子,我需要知道用户的ID。

现在我有以下控制器:

UserController = RouteController.extend({
    onBeforeAction: function () {},
    waitOn: function () {
        var userSub = Meteor.subscribe('user', this.params.name);
        return [userSub]; 
    },
    data: function () { ... },
    action: function () {
        if (this.ready()) {
            this.render('user');
        }
        else {
           ;//this.render('loading');
        }
    }
});

现在我只能waitOn用户,但我也想等待帖子,但我怎么能这样做,因为订阅帖子我需要知道userId:

Meteor.subscribe('posts', user._id);

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

目前加入流星很棘手。在this post中可以找到很多好的信息。对于简单的反应连接,您通常可以直接在路径中执行它们(在"加入客户端"部分中进行了解释)。以下是您的用户/帖子加入的示例:

UserController = RouteController.extend({
  waitOn: function() {
    Meteor.subscribe('user', this.params.name);
  },
  data: function() {
    return Users.findOne({name: this.params.name});
  },
  onBeforeAction: function() {
    if (this.data()) {
      var userId = this.data()._id;
      this.subscribe('posts', userId).wait();
    }
  }
});

正如上面的评论所述,如果您正在寻找非反应性加入,您可以看到我的回答here。对于服务器上的反应性连接,我建议this question