我有一个项目,其中包含多个在路由之间共享的订阅。
我一直在使用会话变量来指示我的订阅何时加载。我可以在我的模板中使用这些会话变量作为帮助程序,并在我的页面上显示不同的加载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这样的每个订阅都有什么东西会很棒。这样的事情存在还是有更优雅的解决方案?
答案 0 :(得分:0)
您已使用该属性this.ready()
,请在Iron Router文档中查看此示例:https://github.com/EventedMind/iron-router/blob/devel/examples/waiton/waiton.js