2015-06-22 77 views
0

我創建了一個我想用作HTTP注入器的Typescript類(請參閱代碼...)。它被添加到Angular模塊作爲服務(而不是工廠)。我注意到了一些問題。Angular with Typescript:HTTP注入器工廠與服務

  1. 當類用大寫字母定義'request'和'response'函數時,注入器不起作用(這些函數從不會被調用)。當用小寫字母定義時,它們被調用。
  2. 當正確調用函數時,「this」對象引用全局窗口而不是對象。

我通過創建真正的工廠(見代碼...)並將它作爲工廠添加到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; 
     } 
    } 
} 

注意「請求」與「響應」。前者將被稱爲。後者不會。

回答

0

注意「請求」與「響應」。前者將被稱爲。後者不會。

JavaScript區分大小寫。 Responseresponse不一樣。你需要保持小寫。

當函數被正確調用時,「this」對象引用全局窗口而不是對象。

您不能使用class(直接至少)的東西,角度都期望成爲工廠工廠不調用new。因此角度調用提供的功能爲TokenInjectionService($rootScope)而不是預期的new TokenInjectionService($rootScope)。最簡單的答案:只需使用一個功能。