Что такое мультипровайдер в angular2

Я понимаю, что этот провайдер предназначен для получения услуг от другого класса, но что такое мультипровайдер и токен?

А также когда мы делаем multi=true ?

provide(NG_VALIDATORS, { useExisting: class),    multi: true })

person blackHawk    schedule 01.07.2016    source источник


Ответы (4)


multi: true означает, что один токен поставщика предоставляет массив элементов. Например, все директивы для поддержки маршрутизатора routerLink, router-outlet предоставляются ROUTER_DIRECTIVES.
Если новый провайдер регистрируется с токеном ROUTER_DIRECTIVES, он переопределяет ранее зарегистрированные директивы. Если установлено значение multi: true (для первого зарегистрированного и нового провайдера), новые директивы добавляются к ранее зарегистрированным директивам вместо переопределения.

Когда вводится ROUTER_DIRECTIVES (constructor(@Inject(ROUTER_DIRECTIVES) directives) {}), вводится массив экземпляров директив. Обычно нет смысла вводить ROUTER_DIRECTIVES. Я использовал его просто в качестве примера, потому что это multi: true.

person Günter Zöchbauer    schedule 01.07.2016
comment
Не могли бы вы привести пример, когда это было бы полезно? - person theFreedomBanana; 20.08.2017
comment
См. пример в stackoverflow.com/questions/39033835/, где несколько фабричных функций могут быть предоставлены под APP_INITIALIZERS, и Angular будет вызывать каждую из них (в той последовательности, в которой они были предоставлены) и ожидает возвращенного Promise. - person Günter Zöchbauer; 20.08.2017
comment
NG_VALIDATORS например. Это: required, min, max, email... - person Yerkon; 27.03.2018
comment
Это могут быть релевантные примеры для multi: true providers: [{ provide: HTTP_INTERCEPTORS, useClass: CustomHttpInterceptorService, multi: true } ] - person Abhijeet Giram; 27.06.2021

Использование multi: true сообщает Angular, что провайдер является мультипровайдером. Как упоминалось ранее, с несколькими поставщиками мы можем предоставить несколько значений для одного токена в DI.

Использование:

Если у нас есть пара директив, которые должны быть автоматически доступны во всем нашем приложении, и никому не нужно определять их в декорациях компонентов, мы можем сделать это, воспользовавшись преимуществами нескольких поставщиков и расширив то, что вводится для PLATFORM_DIRECTIVES.

@Directive(...)
class Draggable { }

@Directive(...)
class Morphable { }

@Component(...)
class RootCmp { }

а также

// at bootstrap
bootstrap(RooCmp, [
  provide(PLATFORM_DIRECTIVES, {useValue: Draggable, multi: true}),
  provide(PLATFORM_DIRECTIVES, {useValue: Morphable, multi: true})
]);

Подробности

person Arpit Agarwal    schedule 01.07.2016
comment
что это значит предоставить несколько значений для одного токена в DI - person blackHawk; 01.07.2016
comment
См. пример кода. Внедрение массива директив/значений в код. Подробная ссылка содержит примеры и пояснения. - person Arpit Agarwal; 01.07.2016
comment
Что это значит, если функция объявлена ​​следующим образом: private get isReverse() что такое ключевое слово get - person blackHawk; 01.07.2016
comment
Это синтаксис машинописного текста, см. stackoverflow.com/questions/ 12827266/get-and-set-in-typescript - person Arpit Agarwal; 01.07.2016
comment
вы регистрируете свои услуги у поставщика услуг токенов (например: NG_VALIDATORS) для событий. Observer использует службу токенов для передачи им всех событий передачи службы регистров (например, форма получит все службы от NG_VALIDATORS, а затем передаст событие всем проверкам) - person HungNM2; 20.10.2020

Что такое мультипровайдер?

Провайдер определяется здесь.

https://angular.io/api/core/Provider

В основном провайдер описывает, как настраивается инжектор. Таким образом, мультипровайдер — это использование нескольких провайдеров вместо одного провайдера, например.

providers: [
 { provide: TOKEN1 , useClass: ClassName1},

 { provide: TOKEN2 , useClass: ClassName2}
]

В приведенном выше сценарии экземпляры обоих классов создаются для данного токена. Затем это доступно для внедрения зависимостей (в конструкторах определенных классов).


Что такое токен?

Токен — это ключ поиска для определения значения зависимости, например, давайте возьмем следующее…

тогда ключ поиска — это ТИП className, а значение зависимости — это INSTANCE его класса.

providers: [ClassName]

В следующем примере TOKEN1 и TOKEN2 являются ключами поиска, а значения зависимостей являются экземплярами обоих классов.

providers: [
 { provide: TOKEN1 , useClass: ClassName1},

 { provide: TOKEN2 , useClass: ClassName2}
]

Когда мы используем multi=true ?

Multi полезен, когда вы регистрируете несколько провайдеров для одного и того же токена. Допустим, в следующем примере вводится последний провайдер, потому что он используется в конце, что означает

вы не сможете использовать экземпляр ClassName1. Итак, что вы можете сделать, так это использовать multi=true, и это сигнализирует Angular о регистрации нескольких поставщиков для одного и того же токена. Итак, это вводит МАССИВ значений.

Какова ценность? значением является INSTANCE классов.

providers: [
 { provide: TOKEN , useClass: ClassName1},

 { provide: TOKEN , useClass: ClassName2}
]

Таким образом, эмпирическое правило заключается в том, что если вы регистрируете несколько провайдеров для одного и того же TOKEN, всегда используйте multi=true, чтобы избежать внедрения первого провайдера. Когда он внедрен, вы можете использовать его в конструкторе класса.

ПРИМЕЧАНИЕ. Я не являюсь экспертом в этой области. Поэтому, если вы заметили какую-либо проблему, сообщите мне об этом.

person Don Dilanga    schedule 26.11.2020

Из документов:

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

Источник

person muetzerich    schedule 01.07.2016