webentwicklung-frage-antwort-db.com.de

Angular 2 - Singleton Services?

In Angular 1 habe ich häufig factories für Dienste verwendet, um den gemeinsam genutzten Zustand zu speichern, auf den viele Komponenten zugreifen können. Es sieht so aus, als würden in Angular 2 alle Dienste, die als @Injectable () injiziert werden, jedes Mal erstellt, wodurch der gemeinsame Status verloren geht.

Ich "registriere" den Dienst beim Metamodul providers des Wurzelmoduls, bekomme aber 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");
   }

}

um es dann in einer Komponente aufzurufen:

@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 gibt vielleicht eine andere Möglichkeit, die ArtistService zu registrieren, damit sie als statische Instanz geladen bleibt. Ist das über DI möglich oder muss eine statische Instanzmethode manuell erstellt werden?

Update:
Stellt sich heraus, dass der obige Code funktioniert . Ich habe an einem falschen Ort gesucht, zusammen mit einem Logikfehler, der dazu führte, dass Daten nicht ordnungsgemäß zwischengespeichert wurden. 

Der obige Code funktioniert und das Zuweisen des Dienstes im Abschnitt providers des AppModule top level ist der Schlüssel, damit die übergeordnete Referenz für die Dauer der AppComponent geladen bleibt. die effektiv geladen bleibt für die Lebensdauer der App, die die Singleton -Instanz bereitstellt. 

Um eine Instanz von transient zu erhalten, können Sie das providers-Meta-Tag und den Dienstnamen auf der tatsächlichen Komponente angeben, die dann den Dienst erstellt, wenn die Komponente geladen/erneut geladen wird.

7
Rick Strahl

Was Sie gezeigt haben, ist ein richtiger Weg. Es erstellt eine einzelne Instanz, die von Komponenten gemeinsam genutzt wird.

https://plnkr.co/edit/FBCa39YC4ZPoy6y8OZQl?p=preview zu Referenzzwecken.

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent }  from './app.component';
import {service} from './service';
@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent],
  providers:[service],

  bootstrap:    [ AppComponent ]
})
export class AppModule { }
3
micronyks

Ich möchte auch ein Objekt erstellen, um es als Anbieter in angle2 zu verwenden, also habe ich ein @injector . Erstellt. Wenn wir jedoch in jeder @Komponente einen Provider festlegen und importieren, verwendet jede Komponente ein anderes Objekt des Injektors ..__ Als ich den Singleton-Provider erstellte, erklärte ich diesen Provider in der übergeordneten Komponente und importiere ihn in jeden. Jetzt funktioniert er einwandfrei. https://angular.io/guide/dependency-injection

3
mukund patel

Ein Singleton-Service darf nur in app.module.ts "Anbietern" (Array) aufbewahrt werden

und es darf nicht in einer anderen Komponente oder einem Dienstanbieter (Array) platziert werden.

wenn dies richtig gemacht wird, dann funktioniert der 2 - 2.4.0 - Singleton perfekt

1

Ok, lassen Sie mich versuchen zu erklären, wie Dienste nach meiner Erfahrung und im Wesentlichen der Dokumentation funktionieren.

Es gibt 3 Hauptszenarien:

  • Der Dienst ist in einem Provider-Array auf Komponentenebene enthalten. Der Dienst kann in das übergeordnete Element und alle untergeordneten Elemente eingefügt werden.

  • Der Dienst ist in einem Provider-Array auf Modulebene enthalten - alles, was in diesem Modul enthalten ist, kennt den Dienst.

  • Der Dienst ist in einem Provider-Array auf Modulebene enthalten. Alles, was in diesem Modul enthalten ist, ist über den Dienst bekannt. Wenn Sie jedoch eine Komponente dieses Moduls in einer anderen Komponente eines anderen Moduls verwenden, das das erste Modul importiert, wird die Instanz des Service für diese Komponente verwendet Sei anders.

1
Tek