Angular: 在 AoT 中提供 Http
Angular: Providing Http in AoT
我正在使用我提供的自定义 http 客户端作为 providefactory 的依赖项。
{
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [Client, Url]
},
在 JiT 中工作正常,但在 AoT 中我收到此错误消息:
ERROR in C:/PATH/src/$$_gendir/app/app.module.ngfactory.ts (1,1): Argument of type 'Client' is not assignable to parameter of type 'Http'.
Property '_backend' is missing in type 'Client'.
但这应该无关紧要,因为它受到保护并且 属性 不会从外部访问,对吧?
我该怎么办?将那些受保护的属性添加到我的客户端不会解决问题,而且我不知道如何使我的 class 扩展 http 而不中断,因为在超级调用中我需要传递一个我不需要的 ConnectionBackend知道它是如何工作的以及如何获得它。
编辑:
我试过 extend 方法但没有成功:
扩展时,如果我有这样的构造函数:
@Injectable()
export class Client extends Http {
constructor(private authService: AuthService, providers: XHRBackend) {
super(providers, null);
this.onInit();
}
或喜欢
@Injectable()
export class Client extends Http {
constructor(private authService: AuthService) {
super(null, null);
this.onInit();
}
将 http methots 覆盖为例如
return super.get(url, this._getOptions(options)).catch((error: any) => this._handleError(error));
它会说:
zone.js:569 Unhandled Promise rejection: Cannot read property 'merge' of null ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'merge' of null
at mergeOptions (http.es5.js:1767)
好吧,我终于找到了解决方案,我会 post 在这里以防其他人需要它:
我像这样扩展了 Angualr 的 Http class:
@Injectable()
export class Client extends Http {
constructor(private authService: AuthenticationService, providers: XHRBackend) {
super(providers, new BaseRequestOptions ());
this.onInit();
}
现在它在 JiT 和 AoT 中工作正常。
编辑:
使用此解决方案我仍然需要导入 HttpModule,但我使用不同于 Http 的 class,这个可以处理 Oauth2 令牌。
添加提供商
useFactory: (
backend: XHRBackend,
defaultOptions: RequestOptions) =>
new CustomHttp(backend, defaultOptions),
deps: [XHRBackend, RequestOptions]
另见
我正在使用我提供的自定义 http 客户端作为 providefactory 的依赖项。
{
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [Client, Url]
},
在 JiT 中工作正常,但在 AoT 中我收到此错误消息:
ERROR in C:/PATH/src/$$_gendir/app/app.module.ngfactory.ts (1,1): Argument of type 'Client' is not assignable to parameter of type 'Http'. Property '_backend' is missing in type 'Client'.
但这应该无关紧要,因为它受到保护并且 属性 不会从外部访问,对吧?
我该怎么办?将那些受保护的属性添加到我的客户端不会解决问题,而且我不知道如何使我的 class 扩展 http 而不中断,因为在超级调用中我需要传递一个我不需要的 ConnectionBackend知道它是如何工作的以及如何获得它。
编辑: 我试过 extend 方法但没有成功: 扩展时,如果我有这样的构造函数:
@Injectable()
export class Client extends Http {
constructor(private authService: AuthService, providers: XHRBackend) {
super(providers, null);
this.onInit();
}
或喜欢
@Injectable()
export class Client extends Http {
constructor(private authService: AuthService) {
super(null, null);
this.onInit();
}
将 http methots 覆盖为例如
return super.get(url, this._getOptions(options)).catch((error: any) => this._handleError(error));
它会说:
zone.js:569 Unhandled Promise rejection: Cannot read property 'merge' of null ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'merge' of null
at mergeOptions (http.es5.js:1767)
好吧,我终于找到了解决方案,我会 post 在这里以防其他人需要它: 我像这样扩展了 Angualr 的 Http class:
@Injectable()
export class Client extends Http {
constructor(private authService: AuthenticationService, providers: XHRBackend) {
super(providers, new BaseRequestOptions ());
this.onInit();
}
现在它在 JiT 和 AoT 中工作正常。
编辑: 使用此解决方案我仍然需要导入 HttpModule,但我使用不同于 Http 的 class,这个可以处理 Oauth2 令牌。
添加提供商
useFactory: (
backend: XHRBackend,
defaultOptions: RequestOptions) =>
new CustomHttp(backend, defaultOptions),
deps: [XHRBackend, RequestOptions]
另见