typescript 使用带有APP_INITIALIZER的Angular注入函数

tkclm6bt  于 2023-06-30  发布在  TypeScript
关注(0)|答案(1)|浏览(119)

在Ivy的帮助下,Angular推出了不错的inject function。根据文档,该函数可以“从提供商的工厂”使用,并附带以下示例:

providers: [
  {
    provide: Car,
    useFactory: () => {
      // OK: a class factory
      const engine = inject(Engine);
      return new Car(engine);
    }
  }
]

这让我相信我现在可以转换我的旧APP_INITIALIZER s:

providers: [
  {
    provide: APP_INITIALIZER,
    useFactory: (engine: Engine) => () => engine.start(),
    deps: [Engine],
    multi: true
  }
]

使用inject函数来做一些简单的事情,像这样:

providers: [
  {
    provide: APP_INITIALIZER,
    useFactory: () => () => inject(Engine).start(),
    multi: true
  }
]

但是,这样做会失败,并显示以下错误消息:
错误:NG0203:inject()必须从注入上下文调用,例如构造函数、工厂函数、字段初始化器或用于EnvironmentInjector#runInContext的函数。
当使用APP_INITIALIZER时,它是否不再是工厂上下文?或者这里有什么问题?

o2gm4chl

o2gm4chl1#

看起来像一个缺失的功能,上下文只存在于顶级函数中。
这是一个工作示例:

providers: [
  {
    provide: APP_INITIALIZER,
    useFactory: () => {
      const engine = inject(Engine);
      return () => engine.start();
    },
    multi: true
  }
]

或者

providers: [
  {
    provide: APP_INITIALIZER,
    useFactory: () => {
      inject(Engine).start();
      return () => {};
    },
    multi: true
  }
]

相关问题