Свойство данных 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 Console и делаю Orders.findOne()._id
и сразу же появляется идентификатор.
По какой-то причине это выглядит как data
выполняется до подписки в waitOn
готов? Я использую последний Железный Маршрутизатор.
2 ответа
Хорошо, вот что мне нужно было сделать, чтобы устранить ошибку и заставить мой маршрут нормально функционировать:
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?
Несмотря на это, люди говорят, что Железный Маршрутизатор data
функция может содержать ошибки и постоянно перезапускать код маршрутизатора, потому что Iron Router считает, что в маршрутизаторе должна быть реактивность. Я не знаю, что с этим происходит.
Я верю 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();
}
}
});