根据不同的会话值发布/订阅相同的集合

时间:2013-07-26 13:30:16

标签: javascript meteor

我想基于不同的路线发布和订阅相同集合的子集。这就是我所拥有的

在/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如何,我都会得到所有问题。

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

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

提前致谢。

1 个答案:

答案 0 :(得分: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();