基于不同的会话值发布/订阅同一集合

Publishing/Subscribing same collection based on different Session value

本文关键字:集合 于不同 会话      更新时间:2023-09-26

我想基于不同的路由发布和订阅同一集合的子集。这是我的

在/server/publish.js 中

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

In/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/tquestions",我想只列出特定用户的问题。为此,我设置了"/users/:user_id/questions"路由,以在"selectedUserId"会话中设置userid(我也在"questionSummaryByUser"发布方法中使用该方法。

然而,当我在"/users/:user_id/aquestions"中看到问题列表时,我得到了所有的问题,而与user_id无关。

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

注意,我刚开始用流星,所以不知道它的来龙去脉。

提前谢谢。

好的做法是在使用收集数据的地方过滤收集数据,而不是依赖于通过订阅获得的子集。这样,即使在向同一集合添加更多订阅时,也可以确保您获得的数据与您想要显示的数据相同。想象一下,如果稍后您想显示一个侧边栏,其中包含来自所有用户的前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();