Я понимаю, что этот провайдер предназначен для получения услуг от другого класса, но что такое мультипровайдер и токен?
А также когда мы делаем multi=true
?
provide(NG_VALIDATORS, { useExisting: class), multi: true })
Я понимаю, что этот провайдер предназначен для получения услуг от другого класса, но что такое мультипровайдер и токен?
А также когда мы делаем multi=true
?
provide(NG_VALIDATORS, { useExisting: class), multi: true })
multi: true
означает, что один токен поставщика предоставляет массив элементов. Например, все директивы для поддержки маршрутизатора routerLink
, router-outlet
предоставляются ROUTER_DIRECTIVES
.
Если новый провайдер регистрируется с токеном ROUTER_DIRECTIVES
, он переопределяет ранее зарегистрированные директивы. Если установлено значение multi: true
(для первого зарегистрированного и нового провайдера), новые директивы добавляются к ранее зарегистрированным директивам вместо переопределения.
Когда вводится ROUTER_DIRECTIVES
(constructor(@Inject(ROUTER_DIRECTIVES) directives) {}
), вводится массив экземпляров директив. Обычно нет смысла вводить ROUTER_DIRECTIVES
. Я использовал его просто в качестве примера, потому что это multi: true
.
APP_INITIALIZERS
, и Angular будет вызывать каждую из них (в той последовательности, в которой они были предоставлены) и ожидает возвращенного Promise
.
- person Günter Zöchbauer; 20.08.2017
NG_VALIDATORS
например. Это: required, min, max, email...
- person Yerkon; 27.03.2018
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})
]);
Что такое мультипровайдер?
Провайдер определяется здесь.
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, чтобы избежать внедрения первого провайдера. Когда он внедрен, вы можете использовать его в конструкторе класса.
ПРИМЕЧАНИЕ. Я не являюсь экспертом в этой области. Поэтому, если вы заметили какую-либо проблему, сообщите мне об этом.
Из документов:
Создает несколько провайдеров, соответствующих одному и тому же токену (мультипровайдер). Несколько провайдеров используются для создания подключаемых услуг, когда система поставляется с некоторыми провайдерами по умолчанию, и пользователь может зарегистрировать дополнительных провайдеров. Комбинация поставщиков по умолчанию и дополнительных поставщиков будет использоваться для управления поведением системы.