在流星上使用铁路由器1.0时,如何显示具有多个订阅的路由的加载模板?

时间:2014-11-16 15:15:05

标签: meteor iron-router

我有一个项目,其中包含多个在路由之间共享的订阅。

我一直在使用会话变量来指示我的订阅何时加载。我可以在我的模板中使用这些会话变量作为帮助程序,并在我的页面上显示不同的加载whirlygigs。当我有一个订阅时这很好(虽然在这种情况下我可以使用" loadingTemplate"我猜)。

每条路线一次订阅 - 没问题:

    this.route('foos', {
        path: '/foos/;id',
        layoutTemplate: 'pagelayout',
        yieldTemplates: {
            'login_header': {to: 'header'},
            'foos': {to: 'main'},
            'footer': {to: 'footer'}
        },
        waitOn: function () {
            Session.set('fooLoading',true);
            return Meteor.subscribe("foos", this.params.id, Session.get("some-input"), {
                onReady: function() {
                    Session.set('fooLoading',false);
                },
                onError: function (error) {
                    Session.set('fooLoading',false);
                }
            });
        }
    });

但是,对于多个订阅,我遇到了麻烦,因为当更新一个订阅时,waitOn挂钩运行,两个会话变量都设置为加载,但只有一个在订阅准备就绪时重置。

每条路线有两个订阅 - 问题:

    this.route('foobar', {
        path: '/foobar/;id',
        layoutTemplate: 'pagelayout',
        yieldTemplates: {
            'login_header': {to: 'header'},
            'foobar': {to: 'main'},
            'footer': {to: 'footer'}
        },
        waitOn: function () {
            //Can put logic here to figure out which subscription will re-run, but gets hacky and is harder to maintain.
            Session.set('fooLoading',true);
            Session.set('barLoading',true);
            var fooHandle = Meteor.subscribe("foo", this.params.id, Session.get("some-input"), {
                onReady: function() {
                    Session.set('fooLoading',false);
                },
                onError: function (error) {
                    Session.set('fooLoading',false);
                }
            });
            var barHandle = Meteor.subscribe("bar", this.params.id, Session.get("some-other-input"), {
                onReady: function() {
                    Session.set('barLoading',false);
                },
                onError: function (error) {
                    Session.set('barLoading',false);
                }
            });
            return [fooHandle, barHandle];
        }
    });

我一直在编写逻辑来决定每个订阅是否会重新运行,但这感觉很糟糕,并且#34; un-meteor"。如果像onBeforeUpdate这样的每个订阅都有什么东西会很棒。这样的事情存在还是有更优雅的解决方案?

1 个答案:

答案 0 :(得分:0)

您已使用该属性this.ready(),请在Iron Router文档中查看此示例:https://github.com/EventedMind/iron-router/blob/devel/examples/waiton/waiton.js