1

我想根据不同的路线发布和订阅同一集合的子集。这是我所拥有的

在 /server/publish.js

Meteor.publish("questions", function() {
  return Questions.find({});
});

Meteor.publish("questionSummaryByUser", function(userId) {
  var q = Questions.find({userId : userId});  
  return q;
});

在 /client/main.js

Deps.autorun(function() {
  Meteor.subscribe("questions");
});
Deps.autorun(function () {
  Meteor.subscribe("questionSummaryByUser", Session.get("selectedUserId"));
});

我正在使用路由器包(https://github.com/tmeasday/meteor-router)。他们希望应用程序工作的方式是,当我转到“/questions”时,我想列出所有用户的所有问题,而当我访问“/users/:user_id/questions”时,我只想按特定列出问题用户。为此,我设置了“/users/:user_id/questions”路由以在“selectedUserId”会话中设置用户ID(我也在“questionSummaryByUser”发布方法中使用它。

但是,当我在“/users/:user_id/questions”中看到问题列表时,我会得到所有问题,而与 user_id 无关。

我在这里读到集合在客户端合并,但仍然无法为上述场景找到解决方案。

请注意,我刚开始使用 Meteor,所以不知道它的进出。

提前致谢。

4

1 回答 1

2

好的做法是在您使用它的地方过滤集合数据,而不是依赖您通过订阅获得的子集。这样,您可以确保获得的数据与您想要显示的数据相同,即使您向同一集合添加更多订阅也是如此。想象一下,如果稍​​后您想显示一个边栏,其中包含来自所有用户的前 10 个问题。然后你也必须获取这些,如果你有一个地方可以显示所有订阅的数据,那么每个函数都会弄得一团糟。

因此,在要显示用户问题的模板中,执行

Template.mine.questions = function() {
    return Questions.find({userId: Meteor.userId()});
};

然后你甚至不需要单独的questionSummaryByUser频道。

 


 

要过滤订阅中的数据,您有多种选择。无论您选择哪种方式,请记住订阅不是您选择要显示的数据的地方。这应该始终如上过滤。

选项1

将所有内容保存在单个参数化通道中。

Meteor.publish('questions', function(options) {
  if(options.filterByUser) {
    return Questions.find({userId: options.userId});
  } else {
    return Questions.find({});
  }
});

选项 2

使所有通道仅在需要时返回数据。

Meteor.publish('allQuestions', function(necessary) {
  if(!necessary) return [];
  return Questions.find({});
});

Meteor.publish('questionSummaryByUser', function(userId) {
  return Questions.find({userId : userId});  
}); 

选项 3

手动关闭客户端中的订阅。在这种情况下,这可能是矫枉过正,它需要一些不必要的工作。

var allQuestionsHandle = Meteor.subscribe('allQuestions');

...

allQuestionsHandle.stop();
于 2013-07-26T14:02:36.803 回答