AngularJS中$ on内的上下文不正确

时间:2014-05-11 00:47:25

标签: javascript angularjs angular-ui-router

我正在尝试处理AngularJS中的http错误(使用ui-router),但在以下代码中丢失了run函数的上下文。

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或者我可以更改它以使其定义我会非常感激!

1 个答案:

答案 0 :(得分:4)

除非在运行块中已经未定义,否则这些都不会被定义。但是,我已经看到了调试工具认为某些变量未实际定义的情况。在FireBug中发生了一个旧的FF版本。