In Angular 1 habe ich häufig verwendet Fabriken für Dienste zum Speichern freigegebenen Zustand von vielen Komponenten zugänglich. Es sieht so aus, als ob in Angular 2 alle Dienste, die als @Injectable() injiziert werden, jedes Mal erstellt werden, wodurch der gemeinsame Status verloren geht.Angular 2 - Singleton-Dienste?
Ich 'registrieren' den Dienst am providers
10 Metastamm des Hauptmoduls, aber ich bekomme immer noch eine vorübergehende Instanz.
Was ich habe:
Injectable()
export class ArtistService {
constructor(private http:Http) {
// firing on each injection
console.log("ArtistService ctor");
}
}
es in einer Komponente rufen dann:
@Component({
selector: 'artist-display',
templateUrl: './artistDisplay.html',
})
export class ArtistDisplay {
constructor(private artistService: ArtistService) {
// instance is fine but transient
}
}
und die Definition des Moduls:
@NgModule({
declarations: [...],
imports: [BrowserModule, FormsModule, HttpModule,
RouterModule.forRoot(rootRouterConfig)],
providers : [
ArtistService,
// make sure you use this for Hash Urls rather than HTML 5 routing
{ provide: LocationStrategy, useClass: HashLocationStrategy },
],
bootstrap: [AppComponent]
})
ich vermute, es ist vielleicht einige andere Möglichkeit, die ArtistService
zu "registrieren", so bleibt es als statische Instanz geladen? Ist das über DI möglich oder muss eine statische Instanzmethode manuell angelegt werden?
Update:
Es stellte sich heraus, dass der obige Code funktioniert. Ich suchte an der falschen Stelle zusammen mit einem logischen Fehler, der dazu führte, dass Daten nicht korrekt zwischengespeichert wurden.
Der obige Code funktioniert und den Dienst in der providers
Abschnitt der obersten Ebene AppModule Zuordnung ist der Schlüssel für die übergeordnete Referenz Aufenthalt für die Dauer des AppComponent geladen machen. die für die gesamte Lebensdauer der App geladen bleibt und die Singleton Instanz enthält.
Um eine transienten Instanz erhalten Sie den providers
Meta-Tag und die Dienstnamen auf dem tatsächlichen Komponente erklären können, die dann den Dienst erstellen, wann immer die Komponente/neu geladen geladen wird.
Hmmm ... es funktioniert nicht für mich. Der Service-Konstruktor wird bei jeder Injektion in die 'ArtistDisplayComponent'-Datei ausgelöst. –
Ich habe einen funktionierenden Link hinzugefügt, der den geteilten Dienst anzeigt. – micronyks
Ok, überprüfe ich und es funktioniert tatsächlich. Bedienungsfehler meinerseits - ich habe mir die falsche console.log() angesehen :-) –