javascript - 基于不同的 Session 值发布/订阅相同的集合

标签 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” session 中设置用户标识(我也在“questionSummaryByUser”发布方法中使用它。

但是,当我在“/users/:user_id/questions”中看到问题列表时,无论 user_id 是什么,我都会得到所有问题。

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

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

提前致谢。

最佳答案

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

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

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

那么您甚至不需要单独的 questionSummaryByUser channel 。


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

选项 1

将所有内容保存在一个参数化 channel 中。

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

选项 2

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

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();

关于javascript - 基于不同的 Session 值发布/订阅相同的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17882649/

相关文章:

javascript - Mongodb父引用树获取当前位置和完整路径

javascript - 数组未显示在模板中,Meteor

javascript - 在 Fabric js 中剪辑到图像的形状

javascript - 如何在不丢失宽高比的情况下使图像填充 90% 的屏幕

javascript - 如何在 vue-multiselect 中没有标签?

javascript - meteor 同步执行系统命令

node.js - 从客户端*桌面* Meteor 应用程序读取/写入/浏览文件?

meteor - 发布自定义Meteor.user()字段

javascript - 如果 doc 有 child ,请删除所有 child ,如果 child 有更多 child ,请删除这些 child

javascript - 文本颜色在 Material-UI 主题中不起作用