带有字符串标记的角度动态 DI



似乎Angular 6(4+?(要求令牌对象是唯一的,以便DI工作。然而,我想使用一个动态令牌,从模板 html 代码中提供,这将允许我的新指令按名称解析服务。

目前代码:

this.service = this.injector.get(new InjectionToken<IServiceRef>(tokenName));

失败,并显示:

Error: StaticInjectorError(AppModule)[InjectionToken the_token_name]: 

当我用旧的已弃用的(角度 4(Injector.get 函数替换我的代码时,它工作正常,因为注入器比较名称(我确实在视图中使用该名称提供服务......但是,使用新的DI,我无法实现我想要的。

那么,如何应对呢?

您必须为令牌使用全局存储对象。我建议您使用地图。

export const tokens: Map<string, InjectionToken<IServiceRef>> = new Map();
tokens.set('tokenName', new InjectionToken<IServiceRef>('tokenName'));

您必须使用 map 对象来声明提供程序。

@NgModule({
providers: [
{provide: tokens.get('tokenName'), useValue: new Service()}
]
);

现在,您可以通过字符串值查找令牌。

this.service = this.injector.get(tokens.get(the_token_name));

我不知道这在 Angular 6 中发生了变化,但我确实记得文档说令牌是通过值引用的。这意味着 DI 使用===来匹配依赖项。

如果按令牌名称匹配,则 DI 中将发生冲突。许多库声明"文档"令牌作为示例。所以你不想使用字符串名称。因为碰撞将极难找到和修复。

相关内容

  • 没有找到相关文章

最新更新