Angular抽象类HttpClient注入

时间:2018-01-22 17:49:14

标签: angular httpclient injectable injectableprovider

大家好,我是Angular的新手,我在使用Injectable类时遇到了麻烦。

我有一个抽象类(在web.ts上),其受保护的属性之一是HttpClient对象。这个抽象类的定义如下:

import { HttpClient } from "@angular/common/http";


export abstract class Web {
   protected baseURL: string;

   constructor(baseURL: string, protected http: HttpClient) {
      this.baseURL =  baseURL;
   }

   public abstract RetrieveData(pattern: string);
}

然后我有另一个扩展Web类的类(在webA.ts上):

import { Web } from './web';

export class WebA extends Web {

   constructor() {
      super("https://www.test.com");
   }

   private Search(pattern: string) {
      pattern = pattern.replace(" ", "+");
      var searchURL = this.baseURL + `/site/searchpage.jsp?st=${pattern}&id=pcat17071`;

      console.log(searchURL);

      this.http.get(searchURL).subscribe(data => {
         console.log(data);
      });
   }

   public RetrieveData(pattern: string) {
      this.Search(pattern);
   }
}

最后,在我的网站的一个组件类中,我想将WebA实例化为:

private webA: Web = new WebA();

它告诉我,我需要在webA.ts中的super("https://www.test.com");上传递一个HttpClient对象。要修复它,我可以为WebA创建构造函数:

constructor(@Inject(HttpClient) http: HttpClient) {
      super("https://www.test.com", http);
}

但是这会导致我private webA: Web = new WebA(this.http);迫使我加入我的组件类:

import { HttpClient } from "@angular/common/http";
...
constructor(private http: HttpClient) {}

我知道必须有另一种方法可以做到这一点,因为在我看来,这是在我的课上打破等级

TL; DR:
我需要"自动注入"一个抽象类上的HttpClient,不需要在扩展类中将此对象作为参数传递给super。

2 个答案:

答案 0 :(得分:1)

删除WebA

中的构造函数
export class WebA extends Web {

   //constructor() {
   //   super("https://www.test.com");
   //}

或重复构造函数参数并使用super()

转发它们
export class WebA extends Web {

   constructor(baseURL: string, protected http: HttpClient) {
      super(baseURL, http);
   }

如果在派生类(WebA)中需要构造函数,唯一的方法是重复参数并转发它们。

<强>更新

使用new Xxx()创建实例时,没有像自动注入这样的精简版。依赖注入仅适用于Angulars DI为您创建的实例。

否则请参阅上面的答案。

答案 1 :(得分:1)

仅当您希望DI机制为您创建类型时,

"auto-inject"才有效。在您的情况下,我认为最好将类WebA声明为@Injectable注入,并在您的类中,只需注入WebA实例。这样HttpClient将自动传递。

@Injectable()
export class WebA extends Web {

   ...

   constructor(private httpClient: HttpClient) {
      super("https://www.test.com", httpClient);
   }

   ...

}