обновление Angular4
В Angular4 OpaqueToken
устарела и будет заменена InjectionToken
. InjectionToken позволяет передавать параметр типового типа.
export let APP_CONFIG = new InjectionToken<MyConfig>("app.config");
Смотрите также
оригинальный
Что? Что такое токен Angular2?
Что такое непрозрачный токен? Для чего его используют?
Токен - это ключ для поставщиков инъекций зависимости углов. Провайдеры регистрируются ключом, а компоненты, директивы и классы услуг, созданные экземплярами DI get, которые вводятся, которые просматриваются ключами поставщика.
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
) должны быть точно такой же экземпляр. Другой экземпляр с тем же содержимым не будет работать. Это позволяет легко найти, где объявлен ключ, и должен ли поставщик и цель инъекции использовать один и тот же ключ.
Для строки это может быть другой экземпляр, это приводит к риску того, что одно и то же строковое значение используется в разных модулях и может вызвать конфликты или неправильный провайдер.
Почему это не помогло? Это именно то, для чего они нужны. – jonrsharpe
Я не понимаю, что такое «токен» в этом контексте. – VSO
* «Элементы ввода, отличные от пробела, и комментарии ... зарезервированные слова, идентификаторы, литералы и пунктуаторы ...» * - https://ariya.io/2012/07/most-popular-javascript-tokens. Вот хороший пример использования «OpaqueToken»; вводя «LOCALE_ID»: http://stackoverflow.com/a/39344889/3001761 – jonrsharpe