2016-03-17 3 views
0

Сказать, что у меня есть этот маршрут:Свойство данных IronRouter работает до waitOn?

Router.route('/order', { 
    template: 'order', 
    name: 'order', 
    layoutTemplate: 'layout', 
    waitOn: function(){ 
     return Meteor.subscribe('orders'); 
    }, 
    data: function(){ 
     return Orders.findOne()._id; 
    } 
    }); 

В папке сервера:

Meteor.publish('orders', function(){ 
    return Orders.find(); 
}); 

На странице загрузки, я получаю cannot read property '_id' of undefined, указывая на Orders.findOne()._id

Но я открыть Chrome консоль и сделать Orders.findOne()._id и он сразу же появляется с идентификатором.

По какой-то причине data запускается до того, как подписка в waitOn готова? Я использую последний Iron Router.

+0

Не могли бы вы поделиться своим изданием()? Кроме того, будет ли только один заказ или будет обрабатываться в публикации()? – smoksnes

+0

Вы можете попробовать 'var data = Orders.findOne(); возвратите данные && data._id', пока не найдете фактический ответ, я думаю. – Kishor

+0

@smoksnes, я добавил свое опубликование. Это всего лишь стандарт «публиковать все». В коллекции Заказов в настоящее время имеется множество заказов. – fuzzybabybunny

ответ

0

Я считаю, что data запускается при оформлении шаблона, и action контролирует это. Попробуйте добавить это:

Router.route('/order', { 
    template: 'order', 
    name: 'order', 
    layoutTemplate: 'layout', 
    waitOn: function(){ 
     return Meteor.subscribe('orders'); 
    }, 
    data: function() { 
     return Orders.findOne()._id; 
    }, 
    action: function() { 
     if(this.ready()) { 
     this.render(); 
     } 
    } 
    }); 
+0

Все еще не работает. Есть что-то очень, очень странное. Я отключил ВСЕ мои маршруты, кроме этого, и написал его точно так же, как вы это делали выше. Я все еще получаю 'невозможно прочитать свойство '_id' неопределенного', но после загрузки страницы я могу сделать' Orders.findOne() ._ id' в консоли и возвращает идентификатор. – fuzzybabybunny

+0

Глядя на мои отладчики, отладчик сначала останавливается на функции 'waitOn', затем на функции' data', затем на функции 'waitOn' * снова *, а затем на функции' action', которая проверяет 'this.ready () '- это' истина', поэтому он снова отображает страницу, а затем снова функцию 'data' * ... и все. Я удалил и снова добавил железный маршрутизатор. Обновлены все пакеты. – fuzzybabybunny

1

Ok, это то, что я должен был сделать, чтобы устранить ошибку и получить мой маршрут, чтобы нормально функционировать:

Router.route('/order', { 
    name: 'order', 
    template: 'order', 
    layoutTemplate: 'layout', 
    waitOn: function(){ 
     return Meteor.subscribe('orders'); 
    }, 
    data: function(){ 
     if(this.ready()){ 
     return Orders.findOne()._id 
     }; 
    }, 
    }); 

я должен был поставить this.ready() внутри функции data, что невероятно странно, потому что я не думаю, что мне когда-либо нужно было это делать раньше, и я не вижу, чтобы кто-то упоминал, что нужно делать это в Iron Router?

Независимо от того, что люди говорят, что функция Iron Router data может быть неисправной, и она постоянно перезапускает код маршрутизатора, потому что Iron Router считает, что в маршрутизаторе должна быть реактивность. Я не знаю, что с этим происходит.

+0

Интересно! Спасибо за информацию. – Kishor

 Смежные вопросы

  • Нет связанных вопросов^_^