我正在开发一个安装了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)后退按钮正在工作,直到我向前导航一步,然后我在尝试在历史堆栈中向前导航时遇到同样的错误。
答案 0 :(得分:0)
我解决了这个问题。 $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams) {}
函数中存在错误。
我尝试将toState.name
与未定义的内容进行比较。
这很奇怪,因为错误发生在状态改变之前。因此,如果在更改状态时出错,请务必检查$stateChangeSuccess
事件处理程序;)