添加AppModule的解放后提供商



Angular 2 寄存器提供商以下方式:

// @NgModule decorator with its metadata
@NgModule({
  declarations: [...],
  imports: [...],
  providers: [<PROVIDERS GO HERE>],
  bootstrap: [...]
})
export class AppModule { }

我想与此声明网站分开注册申请的提供商。

具体来说,我正在使用NSWAG为整个Web API生成服务客户端,我想将它们全部添加为提供商。但是,我不确定该怎么做,因为@NgModule是应用于此AppModule类的属性。

这是可能的吗?

在编译时,任何DI提供商都需要包含在模块中。

由于Angular依赖注入可与打字稿类型符号/令牌一起使用,因此没有JavaScript功能可以完成相同的任务。

您可以做的是在编译时间上动态添加提供商,例如:

import { Load, SomeToken } from '../someplace';

@NgModule({
  declarations: [...],
  imports: [...],
  providers: [
    {
      provide: SomeToken,
      useValue: Load(someVariable)
  ],
  bootstrap: [...]
})
export class AppModule { }

,然后在其他地方实现加载功能并令牌:

export const SomeToken = new OpaqueToken<any>('SomeToken');
export const Load = (someVariable) => {
  // logic to return an @Injectable here. Variable provided could be something like an environment variable, but it has to be exported and static
}

这种方法当然有需要在编译时知道的局限性。另一种方法是在全球范围内导入整个应用程序中所需的所有提供商,无论情况如何,然后懒惰的负载组件将适当的提供商注入了这种情况(Angular将在使用它的组件初始化的组件之前初始化提供商,或创建一个提供商,无论动态标准如何,都可以执行逻辑。一个想法是创建利用此服务并根据该动态标准解决问题的另一种服务(即,您可以在第一个服务上使用一种称为GetLoginInfo的方法,第二个服务将能够解决该方法的正确API调用。(

如果仅是您需要的API信息(即URL(,那么您可以通过从config.json文件或API调用中获取URL信息来实现以上内容,并将这些值注入服务中,以便将呼叫和令牌保留在服务中相同,但使用不同的值。有关如何实现这一目标的更多信息,请参见此处。

相关内容

  • 没有找到相关文章

最新更新