例如,父作用域为字符串"parent"提供SOME_TOKEN,然后当子作用域提供相同的令牌(比方说"child")时,它将附加到该相同令牌提供的值列表中,使其成为["child", "parent"].我想要这个,因为我需要使用我不能更改的库代码.

我try 了以下函数来提供字符串,但它抛出了Circular dependency error.

export const provideToken = (val: string) => {
  return {
    provide: SOME_TOKEN,
    useFactory: () => {
      const token = inject(SOME_TOKEN)
      return token ? [...token, val] : val
    }
  }
}

基本上,我希望获得提供的所有值,但默认情况下,Angular 只给出最接近的值.

我可以通过一项服务实现这一点.模块或组件可以在它们的构造函数中附加到列表中,并删除它们的ngOnDestroy中的字符串,但这似乎很容易出错.

Update

@Anton的答案是有效的,但我也需要能够在共享模块中使用这个概念.例如:

@NgModule({
  declarations: [SharedDirective],
  imports: [],
  exports: [SharedDirective],
  providers: [provideToken("shared")]
})
export class SharedModule {}


@NgModule({
  declarations: [SomeComponent],
  imports: [SharedModule],
  exports: [],
  providers: [provideToken("some")]
})
export class SomeModule {}

如果使用skipSelf,则只提供"some"令牌,忽略"shared"令牌.

Update 2

当在提供程序中使用multi: true时,不会忽略任何令牌,但结果数组将成为嵌套数组,因此注入服务/指令或ETC需要能够使用它.因此,我扩展了库中的指令以扁平化数组并删除其构造函数中的重复项,从而解决了我的问题.

export const provideToken = (val: string) => {
  return {
    provide: SOME_TOKEN,
    useFactory: () => {
      const token = inject(SOME_TOKEN, {skipSelf: true, optional: true})
      return token ? [...token, val] : val
    },
    multi: true
  }
}
// constructor of the extended directive

constructor(
    ...,
    @Optional()
    @Inject(SOME_TOKEN)
    providedToken: MaybeArray<string>,
    ...
) {

   if (Array.isArray(providedToken)) {
            providedToken = [...new Set(providedToken.flat(Infinity))]
   }
   super(..., providedToken, ...)
}

推荐答案

您可以try 使用选项skipSelf注入令牌.它是有效的:

export const provideToken = (val: string) => {
  return {
    provide: SOME_TOKEN,
    useFactory: () => {
      const token = inject(SOME_TOKEN, { skipSelf: true })
      return token ? [token, val] : val
    }
  }
}

Angular相关问答推荐

如何在HTMLTITLE属性中使用Angular 显示特殊字符?

带逻辑的组件decorator 中的Angular 主机侦听器属性

MAT表的内联文本编辑-未刷新编辑图标

天使17中的倒计时器

Angular 应用程序未在Azure应用程序服务中运行

崩溃Angular项目Docker容器

由于ngcc操作失败,Angular扩展可能无法正常工作

从组件调用时服务中的 AddTodo 方法不起作用

找不到模块'webpack'

带有嵌套表单数组的 Angular react式表单

如何在 Angular4 中访问组件的 nativeElement?

如何处理解析器中的错误

等待多个promises完成

如何在 ngFor angular 2 内部使用 track

Angular 2 中的 OnChanges 和 DoCheck 有什么区别?

如何在悬停时向元素添加类?

从 angular2 模板调用静态函数

Angular 4 Bootstrap 下拉菜单需要 Popper.js

安装特定版本的 ng cli

如何从指令访问主机组件?