Метеорный железный маршрутизатор waitOn с асинхронной функцией

Мне нужно вернуть мою подписку в параметре waitOn для iron-router после того, как асинхронная функция будет готова.

Это должно работать так:

this.route('myRoute', {
    template : 'myTemplate',
    path : '/foo/:param',
    waitOn : function () {
        MyAsyncFunction(function(this.params.param){
            var result = 'whatever';
            return Meteor.subscribe('MyCollection', result);    
        });
    },
    data : function () {
        return MyCollection.find().fetch()
    }
});

Каков наилучший способ решить эту проблему с помощью железа-маршрутизатора? Я ищу рекомендуемое решение.


person TJR    schedule 04.08.2014    source источник


Ответы (1)


Вы можете запустить MyAsyncFunction из хука onRun и использовать его для установки реактивной переменной, которая будет запускать обновление подписки.

this.route('myRoute', {
    template : 'myTemplate',
    path : '/foo/:param',
    onRun: function () {
        MyAsyncFunction(function(this.params.param){
            Session.set('result', 'whatever');    
        });
    }, 
    waitOn : function () {
        return Meteor.subscribe('MyCollection', Session.get('result'));
    },
    data : function () {
        return MyCollection.find().fetch()
    }
});

Хук onRun будет перезапущен при изменении параметра.

person Neil    schedule 04.08.2014
comment
запускается только один раз при первой загрузке маршрута. Обратите внимание, что это не запускается снова, если ваша страница перезагружается с помощью горячей перезагрузки кода, поэтому убедитесь, что любые установленные вами переменные будут сохраняться в HCR (например, переменные сеанса). Кажется, это неправильный путь, не так ли? Его не нужно загружать один раз, его нужно загружать каждый раз, когда я буду перезагружать маршрут или использовать другой параметр, но ТАКЖЕ при использовании одного и того же параметра. - person TJR; 04.08.2014
comment
@TimoRütten только что обновился до последней версии Iron-Router, которая отказывается от загрузки в пользу onRun. Он будет работать при изменении параметра или обновлении страницы, но не при HCR. - person Neil; 04.08.2014
comment
Спасибо за эту информацию. Я попробую это завтра и дам ответ. - person TJR; 04.08.2014
comment
Хм. Кажется, это работает так, как вы описали, но проблема в том, что - и я действительно не знаю почему - этот обратный вызов будет вызываться 2 раза, а не один раз при загрузке или изменении параметра. - person TJR; 05.08.2014
comment
Эй, я получил ошибку Отправка маршрута никогда не отображалась. Вы забыли вызвать this.next() в onBeforeAction? но я не определил функцию onBeforeAction ни в этом, ни в каком-либо маршруте. Можешь помочь?@Нил - person delueg; 28.04.2015