javascript - AngularJS 中 $on 中的上下文不正确

标签 javascript angularjs angular-ui-router

我试图在 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/

相关文章:

angularjs - 返回 promise 内的值

AngularJS - UI 路由器 stateChangeSuccess 事件未触发

javascript - 多个抽象 View - Ionic

javascript - 从 env 变量读取跟踪 ID 并在 HTML 文件 head 部分的 GA 脚本标记中使用它

javascript - 我应该如何构建 Firebase 身份验证密码重置流程?

javascript - js函数改成for循环为什么不发送数据

javascript - MIX Wav 文件并使用 Web Audio API 导出

angularjs - ng-template 脚本内的表单验证 angularjs

css - 防止div超出屏幕

angularjs - Angular 应用程序在 Firefox 中中断