带字符串标记的角动态DI

时间:2018-10-25 14:49:57

标签: angular dependency-injection angular-di

似乎Angular 6(4+?)要求令牌 objects 是唯一的才能使DI起作用。但是我想使用从模板html代码提供的动态令牌,这将允许我的新指令通过名称解析名称

当前代码:

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

失败:

Error: StaticInjectorError(AppModule)[InjectionToken the_token_name]: 

当我将代码替换为旧的(在角度4中)Inj​​ector.get函数时,它可以正常工作,因为注入器会比较名称(并且我确实在视图中使用该名称提供服务...)。但是,使用新的DI无法实现我想要的功能。

那么,如何解决?

1 个答案:

答案 0 :(得分:1)

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

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中发生冲突。许多库都以“文档”标记为例。因此,您不想使用字符串名称。因为碰撞将很难找到并修复。