2016-04-06 35 views
10

Il mio costruttore ha parametri opzionali e sembrano confondere il modo predominante di fare DI.Costruttore angolare 2 DI con parametri opzionali

constructor(public name:string, public age?:number, private _service:Service); 

tipografico comprensibilmente non piace che metto un parametro non facoltativo dietro una opzionale, inoltre, il servizio non venga iniettato quando il parametro opzionale non è impostato. Come lo risolvo? Non riesco a metterlo da qualche altra parte nel costruttore dal momento che sarei in attesa di impostare il servizio manualmente.

C'è qualcosa come l'iniezione di campo?

@Inject() private _service:Service; 

constructor(public name:string, public age?:number); 

Devo sostituire i parametri opzionali con i valori predefiniti? Qualche altro suggerimento?

grazie

Modifica Come discusso in seguito, ho cercato di iniettare un servizio in un oggetto che non è creato da DI di angolare. Questo non funziona. Poiché non riesco a creare questa classe (modello) utilizzando DI, ora il servizio viene passato manualmente dalla classe che crea un'istanza di questi oggetti.

risposta

12

Basta aggiungere il decoratore @Optional() prima del parametro costruttore che deve essere immesso solo se è stato registrato un provider.

constructor(public name:string, @Optional() public age:number) 
+0

io possa mancare qualcosa, ma " età "non è la cosa che voglio essere iniettato. Creo un nuovo oggetto usando il costruttore come 'new Person (" Mike ", 32);' e il 'Service' dovrebbe essere iniettato indipendentemente dall'impostazione dell'età o meno. O devo semplicemente annotare ogni facoltativo (TS =?) Con @Optional()? – KenavR

+2

Non sono sicuro di comprendere appieno la tua domanda. Con 'new Person (" Mike ", 32)' non vi è alcuna iniezione di dipendenza coinvolta. DI è coinvolto solo quando le istanze vengono create da DI stesso. Ad esempio, i componenti e le relative dipendenze sono istanziati da DI. Puoi chiarire per favore? –

+0

"DI è coinvolto solo quando le istanze vengono create da DI stesso." Immagino che sia il mio "problema" o cosa che non ho capito. Creo gli oggetti manualmente impostando il nome e l'età usando il costruttore. Pensavo che il DI avrebbe iniettato gli altri parametri con un provider registrato. Indovina che non funziona. – KenavR

1

Se ho capito correttamente cosa stai cercando di fare, hai bisogno di una fabbrica di servizi. Vedi qui: https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

In sostanza,

class MyClass { 
    constructor(public name:string, private _service:Service, public age?:number){} 
} 

E poi

let myFactory = (_service: Service) => { 
    return isAgeOk ? new MyClass(name, _service, age) : new MyClass(name, _service); 
}; 

E allora si dovrebbe fornire il proprio servizio come questo:

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}] 
Problemi correlati