Javascript 在ui路由器上更改状态时angularjs infdig错误(带视频)
新建编辑:检查登录名的authservice: 更新:Javascript 在ui路由器上更改状态时angularjs infdig错误(带视频),javascript,html,angularjs,angularjs-scope,angular-ui-router,Javascript,Html,Angularjs,Angularjs Scope,Angular Ui Router,新建编辑:检查登录名的authservice: 更新: 不幸的是,这是整个web应用程序的一部分,所以我无法将其上传到JSFIDLE上。我制作了一个youtube视频,在那里我在调试应用程序时准确地显示了错误。从1:30分钟开始出现问题。请随意查看视频 下面是我的angular应用程序的app.js 我在模板中输入的$watch(es)会产生错误吗 Youtube,1:30后开始出错: 首次加载站点时,登录屏幕将加载并请求凭据 如果用户登录,它将重定向到part4页面(从登录控制器内部),到目前
不幸的是,这是整个web应用程序的一部分,所以我无法将其上传到JSFIDLE上。我制作了一个youtube视频,在那里我在调试应用程序时准确地显示了错误。从1:30分钟开始出现问题。请随意查看视频
下面是我的angular应用程序的app.js 我在模板中输入的$watch(es)会产生错误吗 Youtube,1:30后开始出错: 首次加载站点时,登录屏幕将加载并请求凭据 如果用户登录,它将重定向到part4页面(从登录控制器内部),到目前为止一切正常 问题是,每当我在浏览器上打开新选项卡时,尝试加载网站:
$rootScope.$on(“$stateChangeError”,
中上升,并进入go.state(第4部分)
error:[$rootScope:infdig]http://errors.angularjs.org/1.4.8/$rootScope/infdig?p0=10&p1=%5B%5D
但奇怪的是,它最终重定向到part4页面,但出现了错误
谁能帮帮我吗
'use strict';
var app = angular.module('MainApp', ['mApp',
'MainApp.loginModule',
'MainApp.part4Module',
'MainApp.part5Module',
'MainApp.eventModule',
'ui.router', 'ui.router.tabs', 'ngCookies']);
angular.module('MainApp')
.run(['$rootScope', '$state', '$cookieStore', 'authService', function ($rootScope, $state, $cookieStore, authService) {
$rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
if (error.unAuthorized) {
$state.go('login');
}
else if (error.authorized) {
$state.go('part4');
}
});
authService.user = $cookieStore.get('user');
}])
.config(function ($stateProvider, $urlRouterProvider, $locationProvider) { //$stateProvider & $urlRouterProvider are from ui.router module
$stateProvider
.state('floorplan', {
url: '/floorplan/:activeEventId/:activeHallId/:activeHallVariant',
controller: 'ParticipantsCtrl',
templateUrl: '/assets/modules/part1/part1.html',
resolve: {
user: ['authService', '$q', function (authService, $q) {
return authService.user || $q.reject({unAuthorized: true});
}]
}
})
.state('event', {
url: '/event/:activeEventId',
templateUrl: 'assets/modules/event/eventPartial.html',
controller: 'eventctrl',
resolve: {
user: ['authService', '$q', function (authService, $q) {
return authService.user || $q.reject({unAuthorized: true});
}]
}
})
.state('part4', {
url: '/part4',
resolve: {
user: ['authService', '$q', function (authService, $q) {
return authService.user || $q.reject({unAuthorized: true});
}]
},
controller: 'part4ctrl',
templateUrl: '/assets/modules/part4/part4Partial.html'
})
.state('login', {
url: '/login',
controller: 'LoginCtrl',
templateUrl: '/assets/modules/login/login.html',
resolve: {
user: ['authService', '$q', function (authService, $q) {
if (authService.user) {
return $q.reject({authorized: true});
}
}]
}
});
$urlRouterProvider.otherwise('login');
});
我在youtube上上传了一段视频,描述并显示了错误:
youtube:你能试试这个吗
.run(['$rootScope', '$state', '$cookieStore', 'authService', function ($rootScope, $state, $cookieStore, authService) {
$rootScope.$on('$stateChangeStart', function (...) {
authService.user = $cookieStore.get('user');
if (authService.user) {
$state.go('part4');
}
else if (!authService.user) {
$state.go('login');
}
});
}
这将在每个路由的声明中跳过解析中的$q的往返。其次,这还将解决您/r在每个路由的解析中始终检查用户的问题。in.config()set
authService.user=$cookieStore.get('user'))
某个地方。应该解决您的问题。我认为状态首先得到解决,因为您在应用程序中注入了$state.run
这会导致尝试使用未定义的用户解析part4状态的resolve,然后引发该事件,并将在下一个摘要周期中解析,因此在您获得ReDirecent to login页面之前,该用法已初始化,这将重定向到part4
尝试在两个angular.run中分开,第一个将运行authService的init而不注入$state。第二个将$state注入$stateCHangeError侦听器的init(仅在第二个侦听器之前定义第一个侦听器)
如果还不够:拆分您的模块:在模块“a”中包含authService的模块与专用的angular.module('a')。运行,在模块“B”中包含authService的模块与angular.module('B')之间存在依赖关系。运行$stateChangeError一切正常。
经过许多小时和许多断点,我意识到问题不是由任何$watch()
引起的,我的控制器上有许多$watch
这只是一个状态问题,正如你在我的问题上看到的,我没有'/'状态,这导致了无限循环,因为:
$stateProvider
搜索我可用的“状态”,但找不到“/”状态,因此它重定向到“登录”状态.state('/', {
url: '/',
controller: 'LoginCtrl',
templateUrl: '/assets/modules/login/login.html',
resolve: {
user: ['authService', '$q', function (authService, $q) {
if (authService.user) {
return $q.reject({authorized: true, user: authService.user});
}
}]
}
});
我对你的
app.js
有点困惑。我很确定它应该是app.run…
而不是angular.module('MainApp')。使用angular.module('MainApp')运行@LJ.Wizard)
是一种更好的做法。它不依赖于设置全局变量,在不知道如何授权的情况下很难提供帮助works@charlietfl我明白了。谢谢。你陷入了一个无限循环。当你被路由到part4状态时,你能得到一个错误吗?授权的?是$stateChangeError而不是$stateChangeStart,否则他是navig除了第4部分和登录:Pyes,我希望@theo itzaris使用$stateChangeStart
和初始化配置中的authService.user=$cookieStore.get('user');
,来处理身份验证和url更改。我正以另一种方式处理。这里不需要$q。
.state('/', {
url: '/',
controller: 'LoginCtrl',
templateUrl: '/assets/modules/login/login.html',
resolve: {
user: ['authService', '$q', function (authService, $q) {
if (authService.user) {
return $q.reject({authorized: true, user: authService.user});
}
}]
}
});