我在app.module中定义了提供者,如下所示:

{
                    multi: true,
                    deps: [ServiceA, ServiceB],
                    provide: HTTP_INTERCEPTORS,
                    useClass: HttpResponseInterceptor,
}

而且效果很好。 问题是,我需要ServiceB可以通过工厂功能进行配置,而且serviceB是可选的, 类似的方法不起作用

// Factory function
serviceBFactory = (param) => { // returns instance of my service or null, depends on param }

...
deps: [ ServiceA, { provide: ServiceB, useFactory: serviceBFactory } ]
...

错误我得到:

Error: StaticInjectorError(AppModule)[InjectionToken HTTP_INTERCEPTORS -> [object Object]]: 
  StaticInjectorError(Platform: core)[InjectionToken HTTP_INTERCEPTORS -> [object Object]]
NullInjectorError: No provider for [object Object]!

是否有任何特殊的语法,或者它是设计无法实现的?

#1楼 票数:0

让我回答我自己的问题;-)因此,我决定手动构建InjectionToken:

export function serviceBFactory() {
    if (APP_CONFIG.serviceBNeeded) {
        return new ServiceB();
    } else {
        return null;
    }
}

const ServiceBToken: InjectionToken<ServiceB> = new InjectionToken<ServiceB>(
  'ServiceB instance or Null', 
  {
    providedIn: 'root',
    factory: serviceBFactory,
  }
);

然后将其传递给deps数组...

deps: [ServiceBToken]

我不知道是否还可以,或者是否有更好的方法来实现我想要的功能,但是这种解决方案至少有效。

  ask by ppotera translate from so

未解决问题?本站智能推荐:

1回复

提供服务对象

我正在尝试使用另一个人( github )的服务工具。 此服务要求将配置传递给它。 根据回购协议: 坦率地说,我不知道如何处理这些信息,因为在我所关注的一些教程中,我从来不需要将设置注入服务中。 Google对我没有太大帮助。 到目前为止,我所做的就是将服务添加到我的模块
1回复

如何在Angular 2中将提供程序添加到Service类?

我有一个使用服务的组件。 该组件看起来像这样: 如您所见,我在组件中添加了HTTP_PROVIDERS提供程序。 之所以可行,是因为DI现在知道了http类。 但是,实际上是我的TestService使用的是Http类,而不是TestComponent 。 我觉得由于这是使
4回复

RuntimeCompiler没有运行时提供程序

我正在尝试按照接受的答案,并调用RuntimeCompiler.clearCache() 这是我试图这样做的方式: 但是我收到了这个错误: 我在这里错过了什么?
1回复

如何为所有延迟加载的模块提供自定义提供程序

我在我的应用程序中使用子组件的延迟加载策略。 在应用程序的顶层,我有自定义HTTP提供程序,它拦截所有ajax调用。 我的延迟加载模块不会影响此自定义提供程序。 有没有办法为他们提供? 没有在component.module文件的providers属性中重复代码。 谢谢!
1回复

app.module提供程序和组件是否共享同一Injectable实例?

当我将可注射的CameraChannelService添加到ngModule的provider数组中时: 它会为该组件创建一个新实例吗? 当我将其注入NgModules声明组件之一时?
1回复

Ionic2 / Angular2应用程序中提供程序内部的提供程序

我有两个提供者。 AppStorage负责设置并从存储中获取值。 OauthService是我的api服务。 现在我将两者都添加到我的app.module 但是,当我运行该应用程序时,oauthService的构造函数中的appStorage对象未定义。 您能
1回复

Angular 2提供程序异常

将服务注入组件时,我看到错误: 未定义提供程序“类别组件”中的一个或多个:[?,[对象对象],BrowserXhr,[对象对象],[对象对象],XHRBackend,[对象对象]]。 请帮助我解决此问题。 非常感谢 下面是我的代码: category.servic
1回复

Angular9'没有为ActivatedRoute提供'

我是 Angular 9 的初学者。我正在关注一个在线视频教程来练习 angular,但是我的代码(与教程相同)有一个问题,我不知道要弄清楚。 实际上,教程将路由的东西都放在 app.module.ts 中,但我使用 app-routing.module.ts 来分离关注点。 当我启动“ng ser