更新 Angular4
在 Angular4OpaqueToken
中已弃用,将由InjectionToken
. InjectionToken 允许传递泛型类型参数。
export let APP_CONFIG = new InjectionToken<MyConfig>("app.config");
也可以看看
原来的
什么?什么是 Angular2 令牌开始?
什么是不透明令牌?它是干什么用的?
令牌是 Angulars 依赖注入提供者的密钥。提供者使用密钥注册,并且由 DI 实例化的组件、指令和服务类获得注入的依赖项,这些依赖项由提供者密钥查找。
DI 支持类型、字符串OpaqueToken
和对象作为键。
export let APP_CONFIG = new OpaqueToken("app.config");
export let APP_CONFIG_2 = {};
providers: [
MyService, // type is key and value
{provide: MyService, useClass: MyFancyServiceImpl}, // type is key, `MyFancyServiceImpl` is the value (or rather the information how to create the value
{provide: 'myservice', useClass: MyService}, // key is a string
{provide: APP_CONFIG, useValue: {a: 'a', b: 'b'}} // key is an `OpaqueToken`
{provide: APP_CONFIG_2, useValue: {a: 'a', b: 'b'}} // key is an object
]
// one of these decorators needs to be added to make DI work
@Injectable()
@Component()
@Directive()
@Pipe()
class MyComponent {
// DI looks up a provider registered with the key `MyService`
constructor(private myService: MyService) {}
// Same as before but explicit
constructor(@Inject(MyService) private myService: MyService) {}
// DI looks up a provider registered with the key 'myService'
constructor(@Inject('myservice') private myService: MyService) {}
// DI looks up a provider registered with the `OpaqueKey` `APP_CONFIG`
constructor(@Inject(APP_CONFIG) private myConfig: any) {}
// DI looks up a provider registered with the object `APP_CONFIG_2`
constructor(@Inject(APP_CONFIG_2) private myConfig: any) {}
对象键 ( APP_CONFIG_2
) 和OpaqueToken
( APP_CONFIG
) 必须是完全相同的实例。具有相同内容的不同实例将不起作用。这使得查找密钥声明的位置以及提供者和注入目标是否使用相同的密钥变得容易。
对于一个字符串,它可以是一个不同的实例,这带来了风险,即在不同的模块中使用相同的字符串值,并可能导致冲突或注入错误的提供程序。