2015-10-10 3 views
3

У нас есть макет, который нуждается в текущих данных, определенный в нашем контроллере, как это:IronRouter получить данные в макете

TripController = RouteController.extend({ 
    layoutTemplate: 'tripLayout', 
    data: function() { 
     return Trips.findOne({_id: this.params._id}); 
    } 
}); 

Наша проблема кажется данных расы:

Большую часть времени Template.currentData() имеет значение null, но иногда (в основном при отладке) это наш data, который мы определили. Проблема возникает только при перезагрузке страницы, когда мы находимся в tripLayout, но не тогда, когда мы вводим раскладку поездки с другой страницы.

Обратите внимание, что мы загрузили `TripController, так как параметры контроллера правильно установлены.

Template.tripLayout.onRendered(function() { // note, this is the layout template 
    Iron.controller.params._id // correct id 
    Template.currentData() // null 
}); 

То, что мы пытаемся достичь раскол раскладка, где правая сторона всегда одинакова, а левая сторона заполнена выходом (см скриншот) layout

UPDATE (это обновление НЕПРАВИЛЬНО)

Я думаю, я нашел ошибку:

waitOn: function() { 
    return [Meteor.subscribe('public-trips'), 
     Meteor.subscribe('my-trips')]; 
} 

Как только я удаляю массив (так что только одна подписка),

data: function() { 
    return Trips.find({}).fetch(); 
} 

больше не возвращает 0. Я посмотрю на это немного больше.

UPDATE2

Так что мое первоначальное предположение было неверным, подписавшись только один не помогает. Это действительно просто состояние гонки.

Update3

мне удалось его воспроизвести: meteorpad

В предупреждениях, он показывает количество игроков, он имеет. Первый раз это 0, а затем 6. Но 0 не должно появляться, так как мы «ждем» его?

+0

У вас есть 'waitOn', определенные в вашем маршруте, который ждет для' подписки Trips' быть загружены? –

+0

Да, мы делаем это так: 'waitOn: function() {return [Meteor.subscribe ('trip')]}' –

+0

И у вас есть шаблон 'load', который я предполагаю? –

ответ

1

Нам удалось решить проблему (это ожидаемое поведение, но мы нашли обходное решение)! Подробности на сайте: https://github.com/iron-meteor/iron-router/issues/1464#issuecomment-158738943

Alright, here's how we fixed that problem:

The first important thing is to to include the action function like so:

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

That worked for almost everything, but we still had some issues. In our case, it was about templates that aren't rendered in using yield, and are thus out of Iron Router's control. Switch these over to content regions (using {{yield 'contentRegionName'}}) and then explicitly render them in the action function like so:

action: function() { 
    if (this.ready()) { 
     this.render(); 
     this.render('contentRegionTemplate', {to: 'contentRegionName'}); 
    } 
} 

You need these action functions, since the waitOn only means that the subs defined there will be added to a waitlist, but not that that waitlist will be waited on. Essentially, what happens now is that your action function is called twice, thanks to reactivity, and the templates are only rendered once the data is ready.

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