【问题标题】:TypeError: Cannot read property 'controller' of undefinedTypeError:无法读取未定义的属性“控制器”
【发布时间】:2015-11-14 21:14:30
【问题描述】:

第一次导航到嵌套路由时,我得到了这个异常,“TypeError: Cannot read property 'controller' of undefined”

这会导致我的应用程序无法正常运行。但是,如果我浏览它,它就会开始正常工作。

下图显示了变量的值,并且抛出的代码行有一个导致问题的未定义控制器。此代码是 Ionic 框架的一部分。

点击图片查看完整尺寸

这是我唯一定义唯一模块的 JavaScript 文件。

angular.module("sa", ["ionic"])
    .run(function($ionicPlatform) {
        $ionicPlatform.ready(function () {
            // hide the accessory bar by default (remove this to show the accessory bar above the keyboard
            // for form inputs)
            if (window.cordova && window.cordova.plugins.Keyboard) {
                window.cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
            }
            if (window.StatusBar) {
                // org.apache.cordova.statusbar required
                window.StatusBar.styleDefault();
            }
        });
    })

.config(function($stateProvider, $urlRouterProvider) {
        $stateProvider
            .state("login", {
                url: "/login",
                templateUrl: "app/manager/login.html"
            })

            .state("manager", {
                abstract: true,
                url: "/manager",
                templateUrl: "app/manager/menu.html"
            })
            .state("manager.jobs", {
                url: "/jobs",
                views: {
                    "managerContent": {
                        templateUrl: "app/manager/requested-jobs.html"
                    }
                }
            })
            .state("manager.detail", {
                url: "/detail",
                views: {
                    "managerContent": {
                        templateUrl: "app/manager/requested-job-detail.html"
                    }
                }
            });

        $urlRouterProvider.otherwise("/login");
});

这是正确加载的 login.html。它还允许单击和导航按钮。

<ion-view view-title="Login" >

  <ion-nav-bar class="bar-light"></ion-nav-bar>

  <ion-content class="has-header" >
    <ion-list>
      <ion-item href="#/manager/jobs">
        Manager
      </ion-item>
    </ion-list>
  </ion-content>

</ion-view>

这是侧面菜​​单文件。

<ion-side-menus enable-menu-with-back-views="false">

  <ion-side-menu-content>
    <ion-nav-bar class="bar-light">
      <ion-nav-back-button>
      </ion-nav-back-button>

      <ion-nav-buttons side="left">

        <button menu-toggle="left" class="button button-icon icon ion-navicon"></button>
      </ion-nav-buttons>

      <ion-nav-view name="managerContent"></ion-nav-view>

    </ion-nav-bar>
  </ion-side-menu-content>

  <ion-side-menu side="left">

    <ion-header-bar class="bar-assertive">
      <span class="title">Cluber</span>
    </ion-header-bar>

    <ion-content>
      <ion-list>
        <ion-item class="item-icon-right" menu-close ui-sref="login">
          <i class="icon ion-ios-arrow-right icon-accessory"></i>Logout
        </ion-item>
      </ion-list>
    </ion-content>

  </ion-side-menu>

</ion-side-menus>

这是在导航到时加载到菜单内容中的文件。

<ion-view view-title="Dashboard">
  <ion-content has-bouncing has-header="true">
    <ion-list>
      <ion-item class="item-border item-icon-right" ui-sref="manager.detail">
        Clean Apartment
        <i class="icon ion-ios-arrow-right icon-accessory"></i>
      </ion-item>
      <ion-item class="item-border item-icon-right" ui-sref="manager.detail">
        Repair Side Walk 
        <i class="icon ion-ios-arrow-right icon-accessory"></i>
      </ion-item>

    </ion-list>
  </ion-content>
</ion-view>

这是我拥有的最简单的示例,它总是重现 JavaScript 异常。同样,这只发生在第一次导航到“manager.jobs”时。

【问题讨论】:

  • 你可以在调用enteringHeaderBar.controller之前使用debug来检查enteringHeaderBar的值。
  • 看起来enteringHeaderBar 未定义。
  • 是的,进入HeaderBar 是未定义的。该值是在误差上方两行计算的。
  • 我没用过ionic,我猜这个javascript是自动生成的?我问是因为在图像中,突出显示上方的 2 行看起来好像 enteringHeaderBar = undefined;
  • 这可能是调试输出...

标签: javascript angularjs ionic-framework angular-ui-router ionic


【解决方案1】:

self.isInitialized 实际上是false,这会将enteringHeaderBar 设置为null(在突出显示的行上方两行)。

您在函数结束时将self.isInitialized 设置为true。这就是为什么它第一次失败,但随后工作的原因(在下一次更新中它是真的,enteringHeaderBar 将被设置为getOffscreenHeaderBar()

【讨论】:

  • 是的,我同意。不幸的是,图像中的代码来自 Ionic 框架,很抱歉没有说清楚。我无法编辑他们的代码。谢谢你的信息。
  • 哦,好的。但为什么这是公认的答案呢? :)
  • 我是 StackOverflow 的新手。我将接受的答案更改为上述答案。
【解决方案2】:

问题在于 menu.html 文件中的以下 HTML 行。我将它嵌套在 &lt;ion-nav-bar&gt; 中,而它必须是 &lt;ion-side-menu-content&gt; 的直接后代。

 &lt;ion-nav-view name="managerContent"&gt;&lt;/ion-nav-view&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多