我试图在 AngularJS 中处理 http 错误(使用 ui-router),但在以下代码中丢失了运行函数的上下文。
bugtracker.run(['$rootScope', '$state', function($rootScope, $state) {
//at this point $state and $rootScope are defined
$rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {
//at this point $state and $rootScope are undefined
});
}]);
导致$stateChangeError触发的代码如下。
//main.js
bugtracker.config(['$stateProvider', '$httpProvider', '$compileProvider', function($stateProvider, $httpProvider, $compileProvider) {
//...
$stateProvider.state('projects.show', {
url: '/{projectId:[0-9]{1,8}}',
templateUrl: '/assets/projects/show.html',
controller: 'ProjectShowCtrl',
resolve: bugtracker.controller('ProjectShowCtrl').resolve
});
//...
}]);
//ProjectShowCtrl.js
projectShowCtrl.resolve = {
project: function(Project, $q, $stateParams, $state) {
var deferred = $q.defer();
Project.findById($stateParams.projectId, function(successData) {
deferred.resolve(successData);
}, function(errorData) {
deferred.reject(errorData); // you could optionally pass error data here
});
return deferred.promise;
},
delay: function($q, $timeout) {
var delay = $q.defer();
$timeout(delay.resolve, 1000);
return delay.promise;
}
};
我希望在 $on 函数调用的匿名函数中定义 $state,以便我可以将用户重定向到 401、403 等页面,但我不确定为什么不是这样。 在我看到的其他示例 ( https://github.com/angular-ui/ui-router/issues/898 ) 中,暗示 $state 是在匿名函数的上下文中定义的。
如果有人能解释为什么 $state 没有定义或者我可以改变什么来定义它,我将不胜感激!
最佳答案
这些不可能是未定义的,除非它们已经在运行 block 中未定义。但是,我已经看到调试工具认为某些变量未定义而实际上未定义的情况。我在使用旧 FF 版本的 FireBug 中发生了这种情况。
关于javascript - AngularJS 中 $on 中的上下文不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587796/