【问题标题】:How do you conditionally subscribe to data on the front end in meteor?流星中如何有条件地订阅前端的数据?
【发布时间】:2013-05-17 23:25:43
【问题描述】:

我知道如何在meteorconditionally publish data,但是您如何有条件地订阅? 我在考虑这样一种情况:您的应用程序具有单独的页面(例如,使用 meteor-router)并且您只需要在某些页面上进行某些订阅。

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

    您还可以根据页面进行多集合发布/订阅。随着页面的变化,订阅会根据页面的内容自动更改:

    客户端 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()。所以这就是服务器如何“看到”客户端想要的页面
    • 来自文档:docs.meteor.com/#meteor_subscribe。显示订阅函数如何接受可以传递给服务器上的发布函数的参数
    【解决方案2】:

    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 可能会更好地处理大量页面
    • @Swadq 显然你可以换掉条件语法。想法是一样的。
    • 是的,这就是为什么我对您的答案发表评论,而不是单独的答案^^
    猜你喜欢
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多