背面的角度ui-router TypeError:a.indexOf不是函数

时间:2017-06-12 16:01:06

标签: angularjs angular-ui-router history back-button

我正在开发一个安装了Angular Material和ui-router模块的Angular 1.6.1 Web应用程序。

从一个州到另一个州的导航工作正常但是当按下浏览器后退按钮时,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)后退按钮正在工作,直到我向前导航一步,然后我在尝试在历史堆栈中向前导航时遇到同样的错误。

1 个答案:

答案 0 :(得分:0)

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

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

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