我正在创作一个棱角库.它包含一个服务,该服务运行库正常工作所需的构造函数中的初始化逻辑.我已经使用静态forRoot()方法设置了库模块,如下所示:

@NgModule({
  imports: [CommonModule],
})
export class LibModule {
  static forRoot(
    config?: Partial<LibConfig>,
  ): ModuleWithProviders<LibModule> {
    return {
      ngModule: LibModule,
      providers: [{ provide: MY_LIB_CONFIG, useValue: config }],
    };
  }

  // This is necessary, so the service is constructed, even if the service is never injected
  constructor(private myLibService: MyLibService) {}
}

注意注入lib服务的构造函数.如果没有构造函数,服务初始化逻辑将仅在库使用者注入服务时运行,这不是我想要的.应该始终构建服务.这对我来说很好.

现在我想提供一个更加独立友好的provideMyLib()功能.以下是我到目前为止实现的内容:

export function provideMyLib(config?: Partial<LibConfig>): EnvironmentProviders {
  return makeEnvironmentProviders([
    { provide: MY_LIB_CONFIG, useValue: config },
  ]);
}

总的来说,它工作得很好,但这里也存在同样的问题,服务只有在使用者注入它时才会被构造.我试图解决的问题是:

  • 将服务添加到提供程序数组-未构造服务
  • provideMyLib()函数中使用inject()函数-&gt;错误:inject必须在注入上下文中运行
  • 创建自定义注入器并使用它注入服务-&>可以工作,但我的服务需要是单例的
  • 未构建使用{ provide: MyLibService, ... }->服务变体的服务

我还研究了Angular 存储库中各种provide*个函数的实现,没有发现任何东西.我如何实现我的提供函数?

推荐答案

如果你想要初始化一些东西,你需要把它连接到ENVIRONMENT_INITIALIZER:

export function provideMyLib(config?: Partial<LibConfig>): EnvironmentProviders {
  return makeEnvironmentProviders([
    { provide: MY_LIB_CONFIG, useValue: config }
    {
      provide: ENVIRONMENT_INITIALIZER,
      useValue: () => {
       inject(MyLibService)
       // do whatever you want here
      },
    }
  }
}

Angular相关问答推荐

Transloco不加载Angular 17中的翻译

如何使用新的@for遍历Angular 为17的对象?

更改动态表单控制Angular 的值

AOS中的数据绑定--可能吗?

无法在Mat-SideNav中绑定模式

Ng serve不工作,没有错误或消息来显示问题所在

使用 primeng Apollo 主题进行实时部署时多次加载 theme.css 和 preloading.css 文件

在指令中获取宿主组件的templateRef

如何在 Angular14 中创建带有验证的自定义输入组件?

使用 RxJS forkJoin 时传递参数的最佳方式

如何从父路由的组件访问激活的子路由的数据?

模块AppModule导入的意外指令LoginComponent,请添加@NgModule 注释

如何在angular 5的组件中格式化日期

即使 withCredentials 为真,Angular 也不会发送在 Set-Cookie 中收到的 Cookie

如何在 Angular 2 中正确设置 Http 请求标头

Angular2:如果 img src 无效,则显示占位符图像

ERROR 错误:StaticInjectorError(AppModule)[UserformService -> HttpClient]:

如何设置背景 colored颜色 IONIC 4

为什么用?模板绑定中的运算符?

No provider for Router?