【问题标题】:Iron Router throwing exception in onDataIron Router 在 onData 中抛出异常
【发布时间】:2014-09-10 04:38:17
【问题描述】:

我在 Iron-router 的路由控制器的 onData() 函数中看到了一个奇怪的异常。只有在我对文件进行更改后才会出现异常,这当然会导致流星重新启动应用程序。我在 github 中放了一个示例来演示这里的问题:https://github.com/benmonro/iron-router-bug

如果您通过单击提交添加一个人,然后单击该人的姓名,一切都会正常加载。但是,如果您随后对某些 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)

【问题讨论】:

    标签: meteor iron-router


    【解决方案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()

    【讨论】:

    • 我很困惑。为什么在没有任何数据的情况下调用“onData”?如果数据还没有准备好,那么它不应该只是等待或超时而不是只返回 null 吗?
    • 这是个好问题。 :) 您可能想提出问题和/或开始深入研究 IR 代码以找出原因。
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 2013-05-24
    • 1970-01-01
    • 2011-05-30
    • 2015-04-04
    • 2017-02-14
    • 2016-08-10
    • 1970-01-01
    相关资源
    最近更新 更多