servicios servicio que inyeccion dependencias crear typescript angular

typescript - servicio - Angular2: Inyectar una clase no @Injectable



servicios angular 6 (3)

angular: 2.0.0-beta.9

¿Es posible inyectar una clase no @Injectable en un component ? Por ejemplo, esta clase podría provenir de una biblioteca de terceros.


Si es posible. De hecho, el decorador @Injectable no especifica que una clase sea inyectable en otras, sino que desea inyectar algo en ella a nivel de su constructor.

Si no desea inyectar algo en su clase, no es obligatorio agregar el decorador @Injectable . Esta clase puede inyectarse en otras.

Creo que este problema de Github podría ayudarte:

Lo importante aquí es comprender la diferencia entre decoradores y anotaciones. Aquí hay un gran artículo sobre este tema:


Creo que sí, es posible. Lo probé sin el decorador @Injectable y funciona bien.

plunker

AuthService.ts

import {Injectable} from ''angular2/core''; import {Http, Response,HTTP_PROVIDERS} from ''angular2/http''; import ''rxjs/Rx''; import {Observable} from ''rxjs/Observable''; export interface sharedObject{ firstName:string; lastName:stirng; } export class AuthService{ user:sharedObject; constructor() { console.log(''AuthService started'') this.user={firstName:"micronyks",lastName:"shah"}; } change() { console.log(''change to angular2''); this.user.firstName="micronyks1"; this.user.lastName="shah1"; } }

Si te preguntas, porque algunas clases, usan DI en el constructor y no usan @Injectable() . Porque esta decorado @, por ejemplo @Components .

El componente Heroes también tiene una dependencia inyectada. ¿Por qué no agregamos @Injectable () al HeroesComponent?

Podemos agregarlo si realmente queremos. No es necesario porque HeroesComponent ya está decorado con @Component. TypeScript genera metadatos para cualquier clase con un decorador, y cualquier decorador lo hará.

Para más información, puede leer este enlace Página angular


Si la clase tiene dependencias, aún puede usarla en DI. Solo proporcione una fábrica para ello

Si desea poder inyectar una clase que tiene dependencias (argumentos de constructor) pero no quiere o no puede aplicar @Injectable() , puede usar una fábrica en su lugar

bootstrap(AppComponent, [ SomeDep, provide(SomeType, {useFactory: (dep) => new SomeType(dep), deps: [SomeDep]}) ]);

Puede crear variables para dichos proveedores para que sean fácilmente reutilizables sin esta engorrosa declaración (como por ejemplo HTTP_PROVIDERS )

export const SOME_TYPE_PROVIDERS: any[] = [ SomeDep, provide(SomeType, {useFactory: (dep) => new SomeType(dep), deps: [SomeDep]}) ];

y luego usarlo como

bootstrap(AppComponent, [SOME_TYPE_PROVIDERS]);