2016-03-17 21 views

risposta

7

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:

2

penso sì è possibile. L'ho provato senza decoratore @Injectable e funziona perfettamente.

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"; 
    }  
} 

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

+0

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

+0

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

+0

nessun problema ma sicuramente puoi fare meglio di me, perché il mio inglese è pessimo, puoi rivedere e modificare se non ti piace la fortuna –

1

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]); 
Problemi correlati