javascript - navigationend - Angular 2 useProveedores existentes
router events subscribe angular 4 (3)
Con este ejemplo
providers: [
A,
{provide: B, useClass: A},
{provide: C, useExisting: A}]
Si usted tiene
constructor(private a: A)
se crea una instancia para el primer proveedor.
constructor(private b: B)
se crea una instancia para el segundo proveedor
constructor(private c: C)
la instancia del primer proveedor se inyecta.
Si comienzas fresco con
constructor(private c: C)
una instancia para el primer proveedor se crea e inyecta
¿Cuáles son los usos para el proveedor de useExisting
?
¿Es useExistingOrThrowIfThereIsNone
o useExistingOrCreateIfThereIsNone
? ¿Se puede elegir uno de estos comportamientos a propósito de alguna manera, dependiendo de nuestras necesidades? Si uno de ellos no es compatible, ¿se puede emular uno no compatible?
La documentación no está del todo clara y solo da un ejemplo de que useExisting
puede reutilizar una instancia de useClass
.
Cuando escribimos {provide: A, useClass: B}
, Angular creará un mapa entre el token A
y la clase B
Cuando escribimos {provide: A, useExisting: B}
, Angular creará un mapa entre token A
y token B
Diferencia entre estos mapas:
- token A -> instancia de clase B
- token A -> token B -> instancia de alguna clase para token B
Solo pequeña adición / aclaración a la respuesta de @GünterZöchbauer.
En realidad es useExistingOrThrowIfThereIsNone cuando estamos hablando de tokens . useExisting crea un alias para otro token , no para una instancia , por lo que debe haber un token referido por useExisting, de lo contrario se lanzará una excepción. Pero cuando hablamos de instancias , funcionará siempre que el último token en la instancia de registros en cadena, en ese sentido es useExistingOrCreateIfThereIsNone.
Considera esto:
// T = token, I = instance
providers: [
{provide: B, useClass: A}, // T[B] => I[A]
{provide: C, useExisting: A}] // T[C] => ??? - there''s no T[A] declared
...
constructor(private a: B) {} // works
...
constructor(private a: C) {} // throws an exception:
En este caso, la segunda declaración arrojará un error porque el token C se refiere al token A pero no hay token A declarado en ningún lado, aunque haya una instancia de clase A en el inyector. Angular no intentará crear la instancia A para la ficha C o la ficha asociada C con la instancia A existente. Lo verifiqué accidentalmente en uno de mis proyectos. :)
Sin embargo, lo siguiente funcionará debido a razones bien descritas en otras respuestas:
providers: [
{provide: B, useClass: A}, // T[B] => I[A]
{provide: C, useExisting: B}] // T[C] => T[B] => I[A]
...
constructor(private a: B) {} // works
...
constructor(private a: C) {} // works
En este ejemplo, se creará una instancia de A para el token C, incluso si no hubo una instancia A creada previamente para el token B. Entonces, para el token C es "use cualquier instancia que se debe proporcionar para el token B", y para el token B es "use la instancia existente A o cree una nueva si no hay ninguna".