Железный роутер meteorjs waitOn и использование в качестве данных о рендеринге

Я пытаюсь получить возвращенные данные в моем Template.rendered функция.

Текущий код:

this.route('editCat', {
    layoutTemplate : 'layoutCol2Left',
    template : 'modCategoriesEdit',
    path : '/mod/categories/edit/:_id',
    yieldTemplates : _.extend(defaultYieldTemplates, {
    'navigationBackend' : {to : 'contentLeft'} 
    }),
    waitOn : function () {
         return Meteor.subscribe('oneCat', this.params._id);
    },
    data : function () {
         return Categories.findOne({_id : this.params._id});
    }
 });

В этом блоке я жду подписки на Collection Document и вернуть документ как данные.

Теперь я могу использовать возвращенный документ в моем шаблоне следующим образом:

<template name="modCategoriesEdit"> 
    <h1>Edit {{name}}</h1>
</template>

Моя проблема заключается в том, что я должен использовать возвращаемые данные в моей визуализированной функции следующим образом:

Template.modCategoriesEdit.rendered = function () {
    console.log(this.data);
}

Но это возвращает "ноль".

Итак, мой вопрос: как можно получить доступ к возвращенным данным в представленной функции?

4 ответа

Решение

Решение:

Просто добавьте следующее в ваш метод iron-router route().

action : function () {
    if (this.ready()) {
        this.render();
    }
}

Чем Шаблон будет отображен после того, как все загружено правильно.

Есть 3 решения, если вы хотите подождать, пока данные waitOn будут готовы перед рендерингом:

1- Добавить action подключиться к каждому маршруту

Router.map(function() 
    {
    this.route('myRoute', 
        {
        action: function() 
            {
            if (this.ready())
                this.render();
            }
        }
    }

2- Используйте onBeforeAction крюк глобально или на каждом маршруте

Пример кода для глобальной ловушки:

Router.onBeforeAction(function(pause) 
    { 
    if (!this.ready())          
        {
        pause(); 
        this.render('myLoading');
        }
    });

myLoading (или любое другое имя) должен быть шаблоном, который вы где-то определили.

Не забывайте this.render линии, в противном случае проблема возникнет при выходе из маршрута (в то время как исходная проблема возникает при загрузке маршрута).

3- Используйте встроенный onBeforeAction('loading') крюк

Router.configure(
    {
    loadingTemplate: 'myLoading',
    });

Router.onBeforeAction('loading');   

myLoading (или любое другое имя) должен быть шаблоном, который вы где-то определили.

С использованием action крюк для проверки this.ready() работает, но похоже, что официальный способ сделать это - вызвать следующее:

Router.onBeforeAction("loading");

Ссылка: https://github.com/EventedMind/iron-router/issues/679

Как сказал @Sean, правильное решение - использовать загрузочный шаблон:

Router.onBeforeAction("loading");

Но если вы не хотите этого, как я, я придумал это решение:

Template.xxx.rendered = function() {
    var self = this;

    this.autorun(function(a) {
        var data = Template.currentData(self.view);
        if(!data) return;

        console.log("has data! do stuff...");
        console.dir(data);
        //...
    });
}

Template.currentData является реактивным, поэтому в первый раз он имеет значение null, а во втором - ваши данные.

Надеюсь, поможет.

- Проверено на Meteor v1.0 с Iron Router v1.0

Другие вопросы по тегам