2016-12-22 8 views
21

Я бег в «непрозрачные жетоны» в качестве решения реализации глобальных констант в угловых 2, например, здесь: Define global constants in Angular 2Что такое угловой 2 Непрозрачный токен и что такое точка?

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

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

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

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

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

+0

Почему это не помогло? Это именно то, для чего они нужны. – jonrsharpe

+0

Я не понимаю, что такое «токен» в этом контексте. – VSO

+0

* «Элементы ввода, отличные от пробела, и комментарии ... зарезервированные слова, идентификаторы, литералы и пунктуаторы ...» * - https://ariya.io/2012/07/most-popular-javascript-tokens. Вот хороший пример использования «OpaqueToken»; вводя «LOCALE_ID»: http://stackoverflow.com/a/39344889/3001761 – jonrsharpe

ответ

42

обновление 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

Вы всегда первый с самым подробным ответом!:) –

+0

@StepanSuvorov Я стараюсь, насколько позволяет мое время. Рад слышать, что вы думаете, что это хороший ответ :) –

+3

@ GünterZöchbauer Не уверен, что я трачу ваше время с благодарностью, но я ценю это! – VSO

5

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

Непрозрачный токен, используемый для ввода другого поставщика (службы) с таким же именем.

Это позволяет избежать коллизий имен.

 const MY_HTTP_TOKEN: OpaqueToken = new OpaqueToken('Http'); 
 

 
    providers: [ 
 
     { provide: MY_HTTP_TOKEN, useClass: Http } 
 
    ] 
 

 
    constructor(@Inject(MY_HTTP_TOKEN) private myHttpService){}

1

Я новичок в угловой 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.

2

Непрозрачный токен - это всего лишь класс времени выполнения, который используется как уникальный идентификатор для поставщиков инжекторов.

Допустим, у вас есть значение «secretId», которое вы хотите использовать в нескольких сервисах и компонентах. Вы не хотите жестко кодировать это в своих сервисах и компонентах, поскольку это изменится в будущем. Также вы хотите написать тесты для своих сервисов и компонентов.

С классом вы можете использовать класс как токен реализации, типа и токена инжектора. Для строкового значения, других литералов, объектов и т. Д. - вам нечего использовать в качестве токена инжектора. Вы можете использовать строку в качестве токена инжектора, но нет никакой ворчания, что строка будет уникальной. С непрозрачными жетонами, даже если два токена имеют одинаковое имя, они будут оцениваться как разные токены.

Смежные вопросы