2016-01-04 41 views
6

Sto cercando di comprendere la necessità di aggiungere il @Injectable() decorazione in servizi in angolare 2.angolare 2 @Injectable() - come funziona

Dalla documentazione: https://angular.io/docs/ts/latest/guide/dependency-injection.html

Perché don' t aggiungiamo @Injectable() a HeroesComponent? Possiamo aggiungerlo se lo vogliamo davvero. Non è necessario perché HeroesComponent è già decorato con @Component. TypeScript genera metadati per qualsiasi classe con un decoratore e qualsiasi decoratore lo farà.

Quindi sostanzialmente si solo bisogno di aggiungere @Injectable() se nessun altro decorazione è disponibile, perché se c'è una decorazione di qualsiasi tipo a disposizione, il compilatore dattiloscritto genererà automaticamente le informazioni sulle dipendenze in base alle variabili che avete passato nel costruttore ad esempio, .: constructor(private logger: Logger)

È giusto? Grazie

+5

Questo è giusto .. – alexpods

+5

I lol'd @alexpods. Che ne dici di aggiungerlo come risposta: D? Per completare un pochino puoi leggere questo [commento] (https://github.com/angular/angular/issues/4404#issuecomment-143920530), l'intera questione è interessante, ma non interamente correlata alla tua domanda. –

risposta

7

Penso che il nome sia un po 'strano e davvero non capisco perché ti dicono di aggiungerlo per le migliori pratiche. Se aggiungerlo a ogni classe è la migliore pratica, non capisco perché sia ​​necessario. Sarebbe più semplice fare controllare il framework ogni classe se il costruttore ha bisogno di roba iniettata o meno. Questo potrebbe essere stato risolto con una proprietà della riga di comando su dattiloscritto per generare sempre (simulati) metadati.

Il consiglio di aggiungerlo sempre, credo sia simile al fatto che il compilatore aggiunga sempre i metadati (il che non è possibile per quanto ne so). Puoi anche (con cautela) solo (e sempre) aggiungerlo alle classi che hanno bisogno di materiale iniettato - anche se hanno un altro decoratore. Questa sarebbe probabilmente la soluzione più esplicita, ma, ehi, essere negligenti può essere sia una cosa negativa che una buona cosa. Sarai il giudice in questo caso.

TL; DR Se avete altri decoratoriE se vostro costruttore ha bisogno di servizi/etc iniettato, allora ne avete bisogno.

+1

Per chiarire, non è necessario per le classi che hanno altri decoratori di classi estesi da 'Injectable' (' Component', etc) ** o ** per le classi con le loro proprietà del costruttore annotate con 'Inject' (ad esempio in ES.next codice). – estus