似乎Angular 6(4+?)要求令牌 objects 是唯一的才能使DI起作用。但是我想使用从模板html代码提供的动态令牌,这将允许我的新指令通过名称解析名称。
当前代码:
this.service = this.injector.get(new InjectionToken<IServiceRef>(tokenName));
失败:
Error: StaticInjectorError(AppModule)[InjectionToken the_token_name]:
当我将代码替换为旧的(在角度4中)Injector.get函数时,它可以正常工作,因为注入器会比较名称(并且我确实在视图中使用该名称提供服务...)。但是,使用新的DI无法实现我想要的功能。
那么,如何解决?
答案 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中发生冲突。许多库都以“文档”标记为例。因此,您不想使用字符串名称。因为碰撞将很难找到并修复。