0

本出版物的目标是发布团队已“解锁”并满足先决条件的问题。它工作正常,但是当团队解决其他问题(添加到 team.solved 字段)时,发布不会响应更新。

我发现这是因为 Teams.findOne({}); 的结果。查询不会被动更新,因此 team.solved 字段永远不会改变。是否有更好的设计可以让它进行反应性更新,还是我必须将其更改为 Teams.find() 并使用 .observeChanges() ?

Meteor.publish("problems", function () {
    if(!this.userId) return [];
    var user = Meteor.users.findOne(this.userId);
    if(!user.profile.team) return [];
    var team = Teams.findOne({_id:user.profile.team});
    return Problems.find({requirements: {$not: {$elemMatch: {$nin: team.solved}}}});
});

如果我在这里使用任何不寻常的约定,请告诉我。

4

1 回答 1

0

有一些不同的包设计可以解决这些类型的问题,我想到了 reywood:publish-composite 和 peerlibrary:reactive-publish。

要使用 peerlibrary:reactive publish 来做到这一点,这在语法上更简单 IMO,您只需将代码包装在自动运行中,如下所示:

Meteor.publish("problems", function () {
    this.autorun(function() {  

      if(!this.userId) return [];

      var user = Meteor.users.findOne(this.userId);

      if(!user.profile.team) return [];

      var team = Teams.findOne({_id:user.profile.team});

      return Problems.find({requirements: {$not: {$elemMatch: {$nin: team.solved}}}});

    });
});

https://atmospherejs.com/peerlibrary/reactive-publish

于 2015-11-23T01:41:45.030 回答