example - ¿Qué es multi proveedor en angular2?
ng-content select angular 6 (3)
De los documentos:
Crea múltiples proveedores que coinciden con el mismo token (un proveedor múltiple). Los proveedores múltiples se utilizan para crear un servicio conectable, donde el sistema viene con algunos proveedores predeterminados, y el usuario puede registrar proveedores adicionales. La combinación de los proveedores predeterminados y los proveedores adicionales se utilizará para impulsar el comportamiento del sistema.
Entiendo que el proveedor es para obtener servicio de otra clase, pero ¿qué es el token y el proveedor múltiple?
¿Y también cuando hacemos multi=true
?
provide(NG_VALIDATORS, { useExisting: class), multi: true })
El uso de multi: true
le dice a Angular que el proveedor es un proveedor múltiple. Como se mencionó anteriormente, con múltiples proveedores, podemos proporcionar múltiples valores para un solo token en DI.
Usos:
Si tenemos un par de directivas que deberían estar disponibles automáticamente en toda nuestra aplicación sin que alguien tenga que definirlas en decoraciones de componentes, podemos hacerlo aprovechando los proveedores múltiples y extendiendo lo que se está inyectando para PLATFORM_DIRECTIVES
.
@Directive(...)
class Draggable { }
@Directive(...)
class Morphable { }
@Component(...)
class RootCmp { }
y
// at bootstrap
bootstrap(RooCmp, [
provide(PLATFORM_DIRECTIVES, {useValue: Draggable, multi: true}),
provide(PLATFORM_DIRECTIVES, {useValue: Morphable, multi: true})
]);
multi: true
significa que un token de proveedor proporciona una matriz de elementos. Por ejemplo, todas las directivas para el enrutador son compatibles routerLink
router-outlet
, el router-outlet
lo proporciona ROUTER_DIRECTIVES
.
Si un nuevo proveedor está registrado con el token ROUTER_DIRECTIVES
, entonces reemplaza las directivas previamente registradas. Si se establece multi: true
(en el primer proveedor registrado y el nuevo), las nuevas directivas se agregan a las directivas previamente registradas en lugar de anularlas.
Cuando se inyecta constructor(@Inject(ROUTER_DIRECTIVES) directives) {}
) se inyecta una matriz de instancias de directivas. Generalmente no tiene sentido inyectar ROUTER_DIRECTIVES
. Lo usé solo como ejemplo porque es multi: true
.