我想根据不同的路线发布和订阅同一集合的子集。这是我的东西
在/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/