带有Typescript的Angular:HTTP Injector Factory与Service

时间:2015-06-22 00:09:41

标签: angularjs typescript angular-http-interceptors

我创建了一个我想用作HTTP注入器的Typescript类(参见代码...)。它作为服务(不是工厂)添加到Angular模块中。我注意到了一些问题。

  1. 当类使用大写字母定义'request'和'response'函数时,注入器不起作用(永远不会调用这些函数)。使用小写字母定义时,会调用它们。
  2. 正确调用函数时,“this”对象引用全局窗口而不是对象。
  3. 我通过创建真正的工厂(参见代码...)并将其作为工厂添加到Angular模块来解决问题。

    但是,我很想知道为什么会这样。有什么想法吗?

    module KernEquity.Angular
    {
        export interface IHttpInjector
        {
            request(request: ng.IRequestConfig): ng.IRequestConfig;
            response(response: any):any;
        }
    
        export function TokenInjectorFactory($rootScope:KernEquity.Angular.IRootScope):IHttpInjector
        {
            var injector = {
                                request: function (config:ng.IRequestConfig)
                                {
                                    if ($rootScope.IsAuthenticated)
                                    {
                                        config.headers["Authorization"] = this.$rootScope.BearerToken.GetTokenHeader();
                                    }
    
                                    return config;
                                },
                                response: function (response:any)
                                {
                                    return response;
                                }
                           }
            return injector;
        }
    
        export class TokenInjectionService
        {
            $rootScope: KernEquity.Angular.IRootScope;
    
            static $inject = ["$rootScope"];
            constructor($rootScope:KernEquity.Angular.IRootScope)
            {
                this.$rootScope = $rootScope;
            }
            request(config: ng.IRequestConfig):ng.IRequestConfig 
            {
                this.$rootScope = null;
    
                return config;
            }
            Response(response: any):any
            {
                return response;
            }
        }
    }
    

    注意“请求”与“响应”。前者将被称为。后者不会。

1 个答案:

答案 0 :(得分:0)

  

注意“请求”与“响应”。前者将被称为。后者不会。

JavaScript区分大小写。 Responseresponse不同。你需要保持小写。

  

正确调用函数时,“this”对象引用全局窗口而不是对象。

你不能使用class(直接至少)对于角度预期为 factory 的东西,因为工厂 没有用{调用 {1}} 的。因此,angular将提供的函数调用为new而不是预期的TokenInjectionService($rootScope)。最简单的答案:只需使用一个函数。