angular ui-router on back press TypeError: a.indexOf is not a function

angular ui-router on back press TypeError: a.indexOf is not a function

我正在开发 Angular 1.6.1 网络应用程序,其中安装了 Angular Material 和 ui-router 模块。

从一个状态导航到另一个状态工作正常,但是当按下浏览器后退按钮时,URL 正在改变但状态没有改变(视图保持不变)!我在控制台日志中收到以下错误:

TypeError: a.indexOf is not a function
at f (angular.js:438)
at m (angular.js:438)
at Object.z.transitionTo (angular.js:438)
at Array.<anonymous> (angular.js:438)
at Object.invoke (angular.js:39)
at g (angular.js:438)
at angular.js:438
at b (angular.js:438)
at n (angular.js:438)
at m.$broadcast (angular.js:146)

$stateChangeStart还没有达到

所以浏览器历史记录堆栈似乎发生了一些变化。

几天前一切正常,从那以后没有任何改变(好吧,根据我的 git 日志)。

我的 $stateProvider 配置分为不同的文件,第一个文件如下所示:

  $stateProvider
        //Main states
        .state('main', {
            abstract: true,
            controller: 'MainController',
            template: '<div ui-view flex layout="column"></div>'
        })
        .state('null', {
            parent: 'main',
            url: '/',
            controller: function($state){
                $state.go('login', {}, {location: "replace", reload: true});
            }
        })
        //main loggedin state loading main loggedin view
        .state('logged-in', {
            parent: 'main',
            abstract: true,
            templateUrl: COMP_DIR + 'core/logged-in/logged-in.view.html',
            controller: 'LoggedInController',
            controllerAs: 'vm'
        })

        .state('no-enterprise', {
            parent: 'logged-in',
            abstract: true,
            template: '<div ui-view flex layout="column"></div>',
            controller: 'NoEnterpriseController'
        })

在此配置之后,我为应用程序的每个模块添加了几个路由文件。之后我像这样添加最后一个路由文件:

 $stateProvider
    //main enterprise state
        .state('enterprise', {
            parent: 'logged-in',
            url: '/{slug}',
            controller: 'EnterpriseController',
            controllerAs: 'vm',
            template: '<div ui-view flex layout="column"></div>'
        })

        //states inside enterprise state
        .state('dashboard', {
            url: '/',
            parent: 'enterprise',
            title: 'Dashboard',
            templateUrl: COMP_DIR + 'dashboard/dashboard.index.view.html',
            controller: 'Dashboard.DashboardController',
            controllerAs: 'vm'
        })

通过向元素添加一个简单的 ui-sref 来触发状态更改并且工作正常,但我无法使用浏览器的后退按钮返回。

有没有人知道为什么会弹出此错误,因此后退按钮无法正常工作?

提前致谢!

编辑:此外,当我刷新应用程序(按 F5)时,后退按钮一直有效,直到我向前导航一步,然后我在历史堆栈中尝试向前导航时遇到同样的错误。

我解决了这个问题。 $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams) {} 函数出错。

我试图将 toState.name 与未定义的内容进行比较。

这很奇怪,因为错误发生在状态更改之前。因此,如果您在更改状态时遇到错误,请务必检查您的 $stateChangeSuccess 事件处理程序 ;)