【发布时间】:2013-05-17 23:25:43
【问题描述】:
我知道如何在meteor 中conditionally publish data,但是您如何有条件地订阅? 我在考虑这样一种情况:您的应用程序具有单独的页面(例如,使用 meteor-router)并且您只需要在某些页面上进行某些订阅。
【问题讨论】:
标签: javascript meteor
我知道如何在meteor 中conditionally publish data,但是您如何有条件地订阅? 我在考虑这样一种情况:您的应用程序具有单独的页面(例如,使用 meteor-router)并且您只需要在某些页面上进行某些订阅。
【问题讨论】:
标签: javascript meteor
您还可以根据页面进行多集合发布/订阅。随着页面的变化,订阅会根据页面的内容自动更改:
客户端 js
Deps.autorun(function() {
Meteor.subscribe("page_subscriptions", Meteor.Router.page());
});
服务器端 js
Meteor.publish("page_subscriptions", function(page) {
if(page=="home") {
return [
Collection1.find({}),
Collection2.find({}),
Collection3.find({})
];
}else if(page=="about") {
return [
Collection3.find({}),
Collection4.find({})
];
}
});
因此,每个页面都有自己的集合集,可以进行个性化查询,同时使用相同的订阅。
因为Meteor.Router.page() 是反应式的,所以一旦您路由到不同的页面,订阅就会改变。
【讨论】:
page 来自哪里?当页面发生变化时,如何在服务器上动态设置和删除发布?
Meteor.router.page()。当订阅变量发生变化时,旧的会自动停止,并使用新的页面名称进行新的订阅。因为它是响应式的,所以只要使用 Meteor Router 更改页面,它就会自动更新为新订阅,而无需更多代码
page 传递给订阅函数?
Meteor.subscribe("page_subscriptions", Meteor.Router.page());,来自Meteor.Router.page(),来自Meteor Router。所以当当前页面改变时(从路由器中的模板名称,订阅改变)。订阅可以带一个参数,这个参数会传给服务器上对应的发布函数,也就是服务器端的page,所以当它发生变化时直接得到Meteor.Router.page()。所以这就是服务器如何“看到”客户端想要的页面
在Deps.autorun() 方法中使用if 语句。 if 语句应针对 Session 变量进行测试,这将使其具有反应性,触发 Deps.autorun 在条件更改时更改订阅。因此:
Deps.autorun(function() {
sub.stop(); // Stop the previous subscription, because it's changed.
if (Session.equals('page', 'foo')) {
sub = Meteor.subscribe('bar');
} else if (Session.equals('page', 'lorem')) {
sub = Meteor.subscribe('ipsum');
}
// etc.
});
【讨论】:
switch 可能会更好地处理大量页面