繁体   English   中英

Angular抽象类HttpClient注入

[英]Angular abstract class HttpClient injection

大家好,我是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);
}

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

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();

它告诉我,我需要在super("https://www.test.com");上传递HttpClient对象super("https://www.test.com"); 在webA.ts中。 要解决此问题,我可以使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的参数传递。

WebA删除构造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为您创建的实例。

否则,请参阅上面的答案。

仅当您希望DI机制为您创建类型时, "auto-inject"才有效。 在您的情况下,我认为最好使用@InjectableWebA为可@Injectable并且在您需要的地方,只需注入WebA实例即可。 这样, HttpClient将被自动传递。

@Injectable()
export class WebA extends Web {

   ...

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

   ...

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM