gpt4 book ai didi

typescript - Angular 2 : can't resolve global service

转载 作者:搜寻专家 更新时间:2023-10-30 22:01:59 25 4
gpt4 key购买 nike

我扩展了 XHRBackend 类,我想注入(inject)我的全局服务,提供 Bootstrap 。我试图通过构造函数注入(inject)它

export class AppXHRBackend extends XHRBackend {
constructor(
browserXHR: BrowserXhr,
baseResponseOptions: ResponseOptions,
@Inject(AppState) private app: AppState) {...}
...
}

但是我得到了 undefined。然后我尝试通过注入(inject)器手动解决它:

    export class AppXHRBackend extends XHRBackend {
constructor(browserXHR: BrowserXhr, baseResponseOptions: ResponseOptions) {
let injector = ReflectiveInjector.resolveAndCreate([AppState]);
let app = injector.get(AppState);
...
}

我得到了AppState的实例,但那是新的实例,我认为这是对的,应该是这样,但我想获得我的单例服务。

这是我如何启动应用程序:

bootstrap(App, [
...
AppState,
provide(ExceptionHandler, {useClass: AppExceptionHandler}),
provide(XHRBackend, {useClass: AppXHRBackend})
])

这是我的服务:

import { Injectable, EventEmitter } from '@angular/core';

@Injectable()
export class AppState {
...
}

顺便说一句,我的服务 AppState 通过它的构造函数很好地注入(inject)了 AppExceptionHandler 类:

export class AppExceptionHandler extends ExceptionHandler {
constructor(@Inject(AppState) private app: AppState) {...}
...
}

而且我没有看到这两个扩展之间有很大的区别,所以我不明白为什么它不适用于 AppXHRBackend

一般来说,我只是希望我的全局服务能够在全局范围内处理 401、403、404 状态码。也许我为了这个目的走错了路?

UPD通过 UseFactory ty @yurzui 提供解决:

{
provide: XHRBackend,
useFactory: (browserXHR: BrowserXhr,
baseResponseOptions: ResponseOptions,
xsrfStrategy: XSRFStrategy,
appState: AppState) => new AppXHRBackend(browserXHR, baseResponseOptions, xsrfStrategy, appState)
,
deps: [BrowserXhr, ResponseOptions, XSRFStrategy, AppState]
}

最佳答案

  • @Inject(AppState) 如果参数的类型也是 AppState

  • 则多余
  • I got instance of AppState, but that was new instance, let injector = ReflectiveInjector.resolveAndCreate([AppState]);

这是预期的。您创建了一个与您的 Angular 应用程序使用的注入(inject)器完全无关的新注入(inject)器,因此您得到了不同的实例。

您可以做的(对于您当前的问题,这不是必需的,也是不可取的)是注入(inject) Injector 并调用 injector.get(AppState) 来获取实例。

  • 很难从代码片段中判断实际问题是什么。可能存在一些循环依赖。

  • 从您提供的 Plunker ( https://plnkr.co/edit/XVk9SaZgAJnJ1DRsUfWm?p=preview ) 那里缺少 http 包,您需要在您的代码中提供 HTTP_PROVIDERS before 覆盖 HTTP_PROVIDERS 中包含的提供程序的提供程序 - 覆盖提供程序(如 XHRBackend)时,此处的顺序很重要。

Plunker example

关于typescript - Angular 2 : can't resolve global service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37956549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com