Ho una domanda DI Angular2. Supponiamo di avere un TestService
e voglio utilizzare 2 diverse istanze di questo servizio all'interno dello stesso componente. Se aggiungo semplicemente un fornitore al componente e aggiungo le 2 istanze al costruttore, finisco con la stessa istanza di servizio. Per esempio:Angular2 DI: inizializzazione di più istanze diverse nello stesso costruttore
TestService
import {Injectable} from "@angular/core";
@Injectable()
export class TestService {
public id: number = Math.random();
public toString(): string {
return "Id: " + this.id;
}
}
componente di prova
import {Component, Input, OnInit} from "@angular/core";
import {TestService} from "../../services/test.service";
@Component({
providers: [TestService]
})
export class TestComponent implements OnInit {
constructor(private _testService1: TestService, private _testService2: TestService) { };
ngOnInit() {
console.log("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", this._testService1.toString());
console.log("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", this._testService2.toString());
}
}
Risultato in consolle
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Id: 0.24242492129168425
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Id: 0.24242492129168425
Qualcuno può dirmi se esiste un modo per utilizzare il meccanismo DI di Angular2 per iniettare più istanze di un servizio all'interno dello stesso componente o dovrei semplicemente rilasciare il DI per questo caso particolare e creare manualmente le mie istanze con un costruttore manuale?
Grazie in anticipo
Sarebbe interessante per che cosa fosse il downvote. –
Semplicemente non sta facendo il lavoro. Se si inietta con useFactory, il factory verrà utilizzato una sola volta per l'iniezione in _testServiceFactory. Ma questo frammento non funzionerà comunque, dato che non hai tipo per l'argomento del costruttore, angolare non può sapere cosa iniettare. –
@TimKachko grazie mille per il vostro prezioso feedback! Ho aggiornato la mia risposta. Hai ragione, riguardo al tipo. L'ho modificato per usare una chiave stringa invece con '@Inject()'. La fabbrica funzionerà comunque. Forse potrei renderlo più ovvio nel codice, ma la factory è una funzione che restituisce una funzione, pertanto DI manterrà un'istanza della funzione restituita e la passerà a ogni classe che inietta ''testService'', e perché una funzione viene passato al costruttore che restituisce un 'nuovo TestService()' ogni volta che viene chiamato, questo funzionerà. –