У меня есть проект, который включает в себя несколько подписок, которые распределяются между маршрутами.
Я использовал переменную сеанса, чтобы указать, когда загружается моя подписка. Я могу использовать эти переменные сеанса в качестве помощников в своих шаблонах и показывать различные загрузочные вихри на моей странице. Это здорово, когда у меня есть одна подписка (хотя в этом случае я мог бы использовать «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];
}
});
Я писал логику, чтобы решить, будет ли повторяться каждая подписка, но это кажется хакерским и «не метеорным». Если бы в каждой подписке было что-то вроде onBeforeUpdate, это было бы здорово. Существует ли такая вещь или есть более элегантное решение?
one = new Blaze.ReactiveVar(false); two = new Blaze.ReactiveVar(false); Router.route('/many', { waitOn: function () { // we'll be ready when both one and two are true. return [ function () { return one.get(); }, function () { return two.get(); } ]; }, action: function () { if (this.ready()) this.render('Page') else this.render('LoadingMany'); } });
16.11.2014