大家好,我是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。
答案 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)
"auto-inject"
才有效。在您的情况下,我认为最好将类WebA
声明为@Injectable
注入,并在您的类中,只需注入WebA
实例。这样HttpClient
将自动传递。
@Injectable()
export class WebA extends Web {
...
constructor(private httpClient: HttpClient) {
super("https://www.test.com", httpClient);
}
...
}