Подтвердить что ты не робот

Что находится в Angular 2 Непрозрачный токен и что такое точка?

Я запускаю "непрозрачные токены" как решение для реализации глобальных констант в Angular 2, например здесь: Определить глобальные константы в Angular 2

Несмотря на чтение docs, я не могу понять смысл.

Использование OpaqueToken предпочтительнее использовать строки в качестве токенов, потому что возможных столкновений, вызванных несколькими провайдерами, использующими одинаковые строка как два разных токена.

Что? Какой токен Angular2 начать? Все, что я получаю от Google, - это ответы на JSON Web Tokens (их роль в auth и т.д. И т.д.), Которые я понимаю, но, очевидно, никак не связаны.

Какой непрозрачный токен? Для чего он используется?

P.S. Подробнее docs на непрозрачных токенах, используемых для обеспечения констант. Однако они мне не очень помогли.

4b9b3361

Ответ 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.