2014-07-18 43 views
0

我在鐵路由器的Route控制器的onData()函數中看到了一個奇怪的異常。這個例外似乎只是在我更改了一個文件,這當然會導致meteor重新啓動應用程序後發生。我在github上提供了一個示例,演示了這裏的問題:https://github.com/benmonro/iron-router-bugIron Router在onData中拋出異常

如果通過單擊提交添加一個人,然後單擊該人的姓名,一切都會正常加載。但是,如果您然後對某些js進行更改(例如添加評論)。 Meteor將重新加載,你會在'onData()'方法中獲得異常,該方法試圖使用'data()'函數返回的數據屬性。

唯一的例外是在這裏:所以你需要添加一個guard或早日回到回調

> 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

的數據是不是重裝之後準備就緒。這裏有一個簡單的解決辦法:

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代碼以找出原因。 –