Что находится в Angular 2 Непрозрачный токен и что такое точка?
Я запускаю "непрозрачные токены" как решение для реализации глобальных констант в Angular 2, например здесь: Определить глобальные константы в Angular 2
Несмотря на чтение docs, я не могу понять смысл.
Использование OpaqueToken предпочтительнее использовать строки в качестве токенов, потому что возможных столкновений, вызванных несколькими провайдерами, использующими одинаковые строка как два разных токена.
Что? Какой токен Angular2 начать? Все, что я получаю от Google, - это ответы на JSON Web Tokens (их роль в auth и т.д. И т.д.), Которые я понимаю, но, очевидно, никак не связаны.
Какой непрозрачный токен? Для чего он используется?
P.S. Подробнее docs на непрозрачных токенах, используемых для обеспечения констант. Однако они мне не очень помогли.
Ответы
Ответ 1
обновить 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
) должен быть одним и тем же экземпляром. Другой экземпляр с тем же содержимым не будет работать. Это упрощает поиск, где объявлен ключ, и указывает ли поставщик и цель внедрения один и тот же ключ.
Для строки это может быть другой экземпляр, это приводит к риску, что одно и то же строковое значение используется в разных модулях и может вызвать конфликты или неправильный провайдер.
Ответ 2
Какой непрозрачный токен? Для чего он используется?
Неактивный токен, используемый для ввода другого поставщика (службы) с тем же именем.
Это позволяет избежать коллизий имен.
const MY_HTTP_TOKEN: OpaqueToken = new OpaqueToken('Http');
providers: [
{ provide: MY_HTTP_TOKEN, useClass: Http }
]
constructor(@Inject(MY_HTTP_TOKEN) private myHttpService){}
Ответ 3
Непрозрачный токен - это просто класс времени выполнения, который используется в качестве уникального идентификатора для поставщиков инжекторов.
Допустим, у вас есть значение "secretId", которое вы хотите использовать в нескольких сервисах и компонентах. Вы не хотите жестко программировать это в своих сервисах и компонентах, так как это изменится в будущем. Также вы хотите написать тесты для ваших сервисов и компонентов.
С классом вы можете использовать класс в качестве маркера реализации, типа и инжектора. Для строкового значения, других литеральных выражений, объектов и т.д. Вам нечего использовать в качестве токена-инжектора. Вы можете использовать строку как токен инжектора, но нет никакой гарантии, что строка будет уникальной. С непокрытыми токенами, даже если два токена имеют одинаковое имя, они будут оцениваться как разные токены.
Ответ 4
Я новичок в angular 2, но я хочу попытаться интерпретировать то, что я понял из https://blog.thoughtram.io/angular/2016/05/23/opaque-tokens-in-angular-2.html в простой код. CMIIW.
...
const CONFIG_ONE = {title: 'My awesome app'};
let configOneToken = 'config'; //'config' is an example of string-type token
const CONFIG_TWO = {title: 'My fantastic app'};
let configTwoToken = 'config';
providers = [
{ provide: configOneToken, useValue: CONFIG_ONE },
{ provide: configTwoToken, useValue: CONFIG_TWO }
];
Этот фрагмент кода будет иметь проблему (более поздняя версия будет переопределять прежнюю), поскольку в нем есть конфликт ('config' == 'config'
).
Это может быть слишком очевидным и бессмысленным в коде игрушек, но в реальном коде мы не сможем легко идентифицировать этот конфликт, когда один из поставщиков определен в сторонней библиотеке.
Итак, чтобы исправить это, мы можем использовать OpaqueToken, как в следующем коде.
...
const CONFIG_ONE = {title: 'My awesome app'};
const OPAQUE_TOKEN_ONE = new OpaqueToken('config'); //this is an example of object-type token
const CONFIG_TWO = {title: 'My fantastic app'};
const OPAQUE_TOKEN_TWO = new OpaqueToken('config');
providers = [
{ provide: OPAQUE_TOKEN_ONE, useValue: CONFIG_ONE },
{ provide: OPAQUE_TOKEN_TWO, useValue: CONFIG_TWO }
];
Два экземпляра одного и того же класса никогда не будут равны (new OpaqueToken('config') != new OpaqueToken('config')
) и поэтому избегают конфликтов. Сам OpaqueToken
является не чем иным, как простым классом do-nothing.