2014-07-18 3 views
0

Я видел странное исключение в функции onData() контроллера маршрута в железе-маршрутизаторе. Исключение происходит только после того, как я внес изменения в файл, который, конечно, заставляет метеорит перезапускать приложение. Я привел образец в github, который демонстрирует проблему здесь: https://github.com/benmonro/iron-router-bugИсключение исключения железного маршрутизатора в onData

Если вы добавите человека, нажав кнопку «Отправить», затем нажмите на имя этого человека, все будет нормально загружено. Однако, если вы затем внесете изменения в некоторые js (скажем, добавьте комментарий). Meteor будет перезагружаться, и вы получите исключение в методе onData(), который пытается использовать свойство данных, возвращаемых функцией 'data().

Исключение здесь:

> Exception in defer callback: TypeError: Cannot read property 'name' of 
> undefined 
>  at RouteController.extend.onData (http://localhost:3000/irDataBug.js?8327f0bf1bedee2437ec14bc4509d8f7e85079ab:33:19) 
>  at RouteController.runHooks (http://localhost:3000/packages/iron-router.js?e9fac8016598ea034d4f30de5f0d356a9a24b6c5:827:16) 
>  at http://localhost:3000/packages/iron-router.js?e9fac8016598ea034d4f30de5f0d356a9a24b6c5:2137:16 
>  at Utils.extend._run.withNoStopsAllowed (http://localhost:3000/packages/iron-router.js?e9fac8016598ea034d4f30de5f0d356a9a24b6c5:2098:21) 
>  at _assign._compute (http://localhost:3000/packages/deps.js?4a82362ae66e863a1c1a8b0a5fec6f665e2038d1:228:38) 
>  at new Deps.Computation (http://localhost:3000/packages/deps.js?4a82362ae66e863a1c1a8b0a5fec6f665e2038d1:160:10) 
>  at Object._assign.autorun (http://localhost:3000/packages/deps.js?4a82362ae66e863a1c1a8b0a5fec6f665e2038d1:380:13) 
>  at http://localhost:3000/packages/iron-router.js?e9fac8016598ea034d4f30de5f0d356a9a24b6c5:2134:12 
>  at Utils.extend._run.withNoStopsAllowed (http://localhost:3000/packages/iron-router.js?e9fac8016598ea034d4f30de5f0d356a9a24b6c5:2098:21) 
>  at _assign._compute (http://localhost:3000/packages/deps.js?4a82362ae66e863a1c1a8b0a5fec6f665e2038d1:228:38) 

ответ

1

Данные не готовы после перезагрузки, так что вы должны добавить guard или раннее возвращение к функции обратного вызова. Вот простое исправление:

onData: function() { 
    var thePerson = Router.current().data(); 
    if (!thePerson) 
    return; 

    if (thePerson.name === "Fred") { 
    console.log("it's fred"); 
    } else { 
    console.log("it's not fred"); 
    } 
} 

Поскольку обратный вызов реактивная, он будет повторно один раз thePerson найден. Альтернативные решения могут включать обратный вызов waitOn, а затем проверку на this.ready().

+0

Я смущен. Почему он вызывает «onData», когда нет данных? Если данные не готовы, не нужно ли просто ждать или тайм-аут вместо того, чтобы просто возвращать null? – Ben

+0

Это хороший вопрос. :) Возможно, вы захотите записать проблему и/или начать копать в IR-код, чтобы выяснить, почему. –

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

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