2016-03-02 10 views
6

Ho bisogno di utilizzare più istanze di un servizio.Come utilizzare i provider in un servizio?

Di solito quando uso un'istanza di questo servizio nella componente, scrivo in questo modo:

@Component({ 
    selector: 'one-component', 
    providers: [provide("token1", {useClass: Service})], 
    template: ` 
     <h1>App</h1> 
    ` 
}) 
export class OneComponent { 
    constructor(@Inject('token1') service:Service) {} 
} 

Ma ora ho bisogno di utilizzare questo servizio in Service2, scrivo in questo modo:

export class Service2 { 
    constructor(@Inject('token1') service:Service) {} 
} 

come sapete, si vede:

Nessun provider

Perché Service2 non dispone di providers: [provide("token1", {useClass: Service})]. Ma dove posso aggiungerlo dato che non ha @Component?

Grazie

+0

dove si usa il Service2? – Ludohen

+0

@Ludohen grazie per l'aiuto, utilizzo Service2 in un componente. –

+0

Allora quello che stai cercando di fare è sicuramente possibile – Ludohen

risposta

2

Purtroppo la configurazione di servizi in questo modo non è attualmente supportato e attualmente non ci sono piani per aggiungere il supporto https://github.com/angular/angular/issues/5622

+0

grazie per avermelo fatto sapere! –

0

Non credo che la risposta di Gunter è completamente corretto qui. Se ho capito correttamente il problema di Hongbo Miao, questo può essere ottenuto "facilmente". Se si desidera ottenere una nuova istanza di un servizio per ogni iniezione, è necessario utilizzare useFactory anziché la configurazione del provider useClass.

Poi, se si ottiene un errore non provider per "token1" in Service2 è perché non è configurare sull'iniettore destra, fratello o genitore di OneComponent ... dove Service2 viene iniettato.

Edit:

Per far funzionare tutto questo si dovrà definire il fornitore Service e Service2 alla componente principale (per esempio). In questo caso, tutti condivideranno la stessa istanza dei servizi.

Se si desidera avere istanze diverse in ogni componente, quindi definire i provider a livello di componente, in cui vengono utilizzati i servizi.

@Component({ 
    providers: [Service, Service2], 
    // Other config props 
}) 
export class RootComponent { 
} 

@Component({ 
    // Config props 
}) 
export class OneComponent { 
    constructor(public service: Service) {} 
    methodx() { 
    this.service... 
    } 
} 

@Component({ 
    // Config props 
}) 
export class TwoComponent { 
    constructor(public service: Service2) {} 
    methodx() { 
    this.service... 
    } 
} 

@Injectable() 
export class Service2 { 
    constructor(public service: Service) { 
    } 
} 

utilizzando il @Inject('StringToken') non è la cosa migliore che si fa e non è il metodo consigliato. Utilizzare invece il token di tipo (come fatto nel codice sopra).

Risorse:

+0

grazie, avrò un assegno presto! –

+0

Sulla base del tuo codice e di quello che voglio, ho un altro 'ThreeComponent' che usa anche' Service', e voglio 'OneComponent' e' ThreeComponent' usano diverse istanze di 'Service'. Questo è il motivo per cui aggiungo un token quando si usa 'Service'. Quindi in 'Service2' non ho modo di usare' providers' per 'Service'. –

+0

'Service2' non ha bisogno di nulla di speciale, i provider sono definiti sopra nell'albero dell'iniettore – Ludohen

0

ho corretto questo errore (Utilizzo di un servizio di B in un servizio A) dichiarando i due servizi in app.module.ts 's fornitori di serie .

@NgModule({ 
    declarations: [...], 
    imports:  [...], 
    providers: [ 
     ServiceA, 
     ServiceB, 
    ], 
    bootstrap: [...], 
}) 
Problemi correlati