2016-05-31 9 views
3

Ich habe einen Dienst für die gemeinsame Nutzung von Daten zwischen Komponenten und anderen Diensten. Ich injiziere es in Komponenten und Dienste mit eckigen DI. Der Dienst speichert einige Daten in seinen Eigenschaften (nicht statisch). Ich benutze auch einen ComponentResolver, um Komponenten dynamisch zu erstellen und zu laden und sie dann zu zerstören. Das Problem ist, ... wenn ich einen solchen Dienst in einer Komponente injizieren einfach mit:Einen Singleton-Dienst in angular2 injizieren

constructor(private myService: MyDataService) { ... } 

Eine neue Instanz dieses Servers jedes Mal injiziert wird und die Daten verloren gehen. Ich könnte die Daten statisch speichern, aber dann gibt es Beobachter, die diese Daten abonnieren. Lange Rede, kurzer Sinn - zu viele Dinge, um in statische Variablen umzuformen. Gibt es eine Art, der DI von angular zu sagen, nur eine Instanz dieses Dienstes zu erstellen und sie in jeder einzelnen Injektion zu teilen?

Antwort

1

Dies liegt daran, winkelförmigen Stangen DI eine einzelne Instanz unterhält pro Anbieter

Wenn Sie den Dienst nur einmal (Stammkomponente oder bootstrap()) zur Verfügung stellt, dann wird es nur eine Instanz und jeder Dienst oder eine Komponente, die injiziert werden Es wird dieselbe Instanz erhalten.

Update

Ja, Sie Verwendung

@NgModule({ 
    providers: [MyService], 
    ..., 
}) 
export class AppModule {} 
haben

oder

@Component({ 
    selector: 'my-app', 
    providers: [MyService], 
    ... 
}) 
export class AppComponent {} 

(oder alternativ viewProviders)

zu pr Ovide injectables, aber wenn Sie Singletons haben wollen, stellen Sie sicher, dass Sie eine injizierbare nur einmal liefern.

Wenn Sie dasselbe injizierbare Objekt mehr als einmal bereitstellen, wird die Instanz von diesem Anbieter anstelle von der Instanz eines Vorfahren, an der es bereitgestellt wird, auch von der Komponente, für die Sie es bereitstellen, und allen Nachkommen verwendet.

DI ist hierarchisch und sieht von der aktuellen Komponente in Richtung Root-Komponente und AppModule für einen Anbieter. Es injiziert die Instanz von dem ersten Anbieter, der auf diese Weise gefunden wird.

+0

Richtig, müssen Sie den Boostrap oder zumindest einen Ansichtsanbieter verwenden, um den DI im Konstruktor zu verwenden? Es ist mein Verständnis, dass alle Injected-Dienste Singletons sind, ich wusste nicht, dass es möglich war, es als neue Instanzen zu tun. –

+0

Ich aktualisierte meine Antwort, weil es zu lange nach einem Kommentar war. –

+0

Danke, das hat funktioniert! – marius

Verwandte Themen