angolare: 2.0.0-beta.9Angular2: Iniettare una classe @Injectable non
E 'possibile iniettare una classe non @Injectable
in una component
? Ad esempio, questa classe potrebbe provenire da una libreria di terze parti.
angolare: 2.0.0-beta.9Angular2: Iniettare una classe @Injectable non
E 'possibile iniettare una classe non @Injectable
in una component
? Ad esempio, questa classe potrebbe provenire da una libreria di terze parti.
Sì, è possibile. In effetti il decoratore @Injectable
non specifica che una classe sia iniettabile in altre ma che si voglia iniettare qualcosa al suo livello di costruttore.
Se non si desidera iniettare qualcosa nella classe, non è obbligatorio aggiungere il decoratore @Injectable
. Questa classe può essere iniettata in altre.
Penso che questo tema Github potrebbe aiutare:
Ciò che è importante qui è quello di capire la differenza tra decoratori e annotazioni. Qui è un grande articolo su questo argomento:
penso sì è possibile. L'ho provato senza decoratore @Injectable
e funziona perfettamente.
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";
}
}
Se vi chiedete, perché alcuni di classe, l'uso DI nel costruttore e non utilizzare @Injectable()
. Perché questo decorato @, ad esempio @Components
.
Anche HeroesComponent ha una dipendenza iniettata. Perché non aggiungere @Injectable() a HeroesComponent?
Possiamo aggiungerlo se lo vogliamo davvero. Non è necessario perché l'HeroesComponent è già decorato con @Component. TypeScript genera metadati per qualsiasi classe con un decoratore e qualsiasi decoratore eseguirà.
Per maggiori informazioni è possibile leggere questo link Angular page
Se la classe ha delle dipendenze è ancora possibile utilizzarlo in DI.Basta fornire una fabbrica per esso
Se si vuole essere in grado di iniettare una classe che a sua volta ha le dipendenze (argomenti del costruttore), ma non si vuole o non è possibile applicare @Injectable()
, quindi è possibile utilizzare una fabbrica invece
bootstrap(AppComponent, [
SomeDep,
provide(SomeType, {useFactory: (dep) => new SomeType(dep),
deps: [SomeDep]})
]);
è possibile creare variabili per tali fornitori per renderli facilmente riutilizzabili senza questa dichiarazione ingombrante (come ad esempio HTTP_PROVIDERS
)
export const SOME_TYPE_PROVIDERS: any[] = [
SomeDep,
provide(SomeType, {useFactory: (dep) => new SomeType(dep),
deps: [SomeDep]})
];
e quindi utilizzarlo come
bootstrap(AppComponent, [SOME_TYPE_PROVIDERS]);
Oh grazie per il suggerimento. Ma ora se a qualcuno piace la mia risposta vedrò anche il tuo commento e andrà nella giusta direzione :-) – micronyks
Oh great man! Perché non modifichi la mia risposta e link a angular.io. Accetterò la modifica :-). Sono in qualche lavoro quindi non posso farlo come previsto immediatamente. :-) – micronyks
nessun problema ma sicuramente puoi fare meglio di me, perché il mio inglese è pessimo, puoi rivedere e modificare se non ti piace la fortuna –