Метеор: визуализированная функция вызывается перед загрузкой документов

У меня есть шаблон с отображаемой функцией, например:

Template.config.rendered = function () {
    var barfoo = BarFoo.findOne({....});

    if (barfoo) {
        $('[start-date]').datepicker({ ... });
    }
}

Проблема в том, что коллекция BarFoo все еще пуста во время вызова функции rendered.

Я использую Iron Router, поэтому я могу подождать, пока определенные подписки загрузят свои документы:

HomeController = RouteController.extend({
    ...
    waitOn: function () {
        return Meteor.subscribe('barfoo');
    }
});

Итак, вопрос в том, как возможно, чтобы отображаемая функция вызывалась до загрузки данных barfoo?


person Jeanluca Scaljeri    schedule 05.07.2014    source источник


Ответы (1)


Вы можете использовать onData в своем контроллере маршрутов. Если вы используете параметр data:

data: function() {
    bar: BarFoo.findOne({....})
}
onData: function() {
    if(BarFoo.findOne({....})) {
        $('[start-date]').datepicker({ ... });
    }
}

onData запускается каждый раз, когда изменяется возвращаемое значение data, поэтому вы можете сначала проверить, есть ли там значение, его также можно реактивно изменить, если ваша подписка изменится.

Другой вариант — добавить шаблон загрузки, который будет отображаться во время завершения подписки:

loadingTemplate : 'template'
person Tarang    schedule 05.07.2014
comment
Проблема с этим решением заключается в том, что вы делаете определенные шаблоны в своем контроллере. Кроме того, когда я определяю шаблон загрузки, визуализированная функция вызывается до отображения шаблона загрузки. Я нашел другой обходной путь, который, кажется, работает, который заключается в определении Deps.autorun(function () { .... }) внутри отображаемой функции. - person Jeanluca Scaljeri; 05.07.2014
comment
@JeanlucaScaljeri, я тоже думаю, что вы можете определить шаблон загрузки для каждого шаблона. В любом случае onData использует Deps.autorun под капотом. просто не забудьте запустить .stop() для дескриптора, возвращаемого им в обратном вызове уничтожения вашего шаблона, чтобы очистить его, когда вы покидаете шаблон - person Tarang; 05.07.2014
comment
загрузка шаблона для каждого шаблона, что было бы интересно, у вас есть идеи, как это сделать (или ссылка)? и большое спасибо за совет .stop()! - person Jeanluca Scaljeri; 05.07.2014