page navigationend change angular2 javascript typescript angular angular2-services

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".