![](/img/trans.png)
[英]Angular HttpClient constructor and abstract HttpHandler class
[英]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"
才有效。 在您的情况下,我认为最好使用@Injectable
类WebA
为可@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.