我想基于不同的路线发布和订阅相同集合的子集。这就是我所拥有的
在/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,因此不知道它的进出。
提前致谢。
答案 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();