$ rootScope在http拦截器响应方法中未定义

时间:2016-01-14 06:31:27

标签: angularjs typescript

我有一个拦截器,我正在配置加载ajax微调器。

interface IInterceptorScope extends angular.IRootScopeService {
        loading: number;
    }

    export class Interceptor {

        public static Factory($q: angular.IQService, $rootScope : IInterceptorScope) {
            return new Interceptor($q, $rootScope);
        }


        constructor(private $q: angular.IQService, private $rootScope: IInterceptorScope) {
            this.$rootScope.loading = 0;
        }


        public response(response) {
            console.log(response);
            this.$rootScope.loading = 1;
            return response || this.$q.when(response);
        }

        public responseError(rejection) {
            console.log(rejection.status);
            if (rejection.status === 401) {
            }

            return this.$q.reject(rejection);
        }
    }

我收到此错误:

enter image description here

$q也未定义。我不确定为什么。有人可以帮忙吗?

编辑:这就是我在config()块中添加拦截器的方法,减去其他参数,它看起来像这样:

.config($httpProvider : angular.IHttpProvider) => {
     $httpProvider.interceptors.push(Interceptor.Factory);
}

注册工厂:

.factory('Interceptor', Interceptor)

作为参考,我在这里看第一个答案:

AngularJS global $http state ajax loader

$rootScope在这里有loading属性,但这是用纯JavaScript,所以我不确定它是否与TypeScript在这里的方式有关。

1 个答案:

答案 0 :(得分:6)

Angular调用response方法而不设置this;要使用TypeScript处理此问题,请使用函数属性捕获this,如:

public response = (response) => {
   console.log(response);
   this.$rootScope.loading = 1;
   return response || this.$q.when(response);
}

同样适用于responseError