2017-03-17 5 views
1

In der Angular Docs FAQ Abschnitt heißt es, "Im Gegensatz zu Anbietern der Module beim Start geladen, sind Anbieter von Lazy-Loaded-Module Modul-Bereich."linkWie stelle ich einen Service in einem Lazy-Loaded-Modul zur Verfügung und habe ich diesen Service nur auf das Lazy-Loaded-Modul und seine Komponenten beschränkt?

Does ‚Modul-scoped‘ hier nur bedeuten, das Modul oder erstreckt er alle Komponenten enthalten zu diesem Modul gehör?

Der Grund warum ich frage ist, weil ich ein lazy-loaded Modul mit 2 Komponenten habe, die dazu gehören. Ich registriere einen Dienst im Modul, aber aus irgendeinem Grund erhält jede Komponente eine andere Instanz dieses Dienstes.

Was muss ich ändern, um LazyModuleService in meinem Lazy-Loaded-Modul zur Verfügung zu stellen und diesen Service nur auf das Lazy-Loaded-Modul und seine Komponenten zu beschränken? Bitte fügen Sie zusätzliche Dateien hinzu. Ich habe versucht, ein allgemeines Beispiel zu geben, um anderen zu helfen, die diese Frage finden könnten.

Lazy-Modul geladen:

import { CommonModule } from '@angular/common'; 
import { NgModule } from '@angular/core'; 
import { Component1 } from './component1.component'; 
import { Component2 } from './component2.component'; 
import { LazyModuleService } from './lazy-module.service'; 

@NgModule({ 
    imports: [ 
    CommonModule, 
    ], 
    declarations: [ 
    Component1, 
    Component2, 
    ], 
}) 

export class LazyLoadedModule { } 
+0

Haben Sie LazyModuleService in Ihren Komponenten Ihres Lazy-Moduls als Provider konfiguriert? – snorkpete

+0

Nein, tue ich nicht. Es ist nur im LazyLoaded-Modul konfiguriert. – FlashBanistan

+0

Ich nehme an, dies ist ein Tippfehler, aber Sie haben nicht LazyModuleService als Anbieter in Ihrem LazyModule – snorkpete

Antwort

5

Wie verzögertes Laden funktioniert:

Nach einer tiefen Untersuchung, es scheint, als ob das Problem ist ähnlich wie ein träges Laden implementiert ist.

In Ihrem Fall hatte Ihr Lazy-Loaded-Modul tatsächlich Routing zu 2 verschiedenen Komponenten darin - beide Komponenten wurden direkt als Router.forChild Routen ausgesetzt. Wenn Sie jedoch zu jeder Komponente navigiert sind, wurde eine separate Instanz der Provider Ihres Lazy Loaded Moduls zu jeder Komponente hinzugefügt.

Da Sie eigentlich alle Komponenten im Lazy-Loaded-Modul die gleiche Instanz der bereitgestellten Dienste verwenden möchten, müssen Sie eine einzelne "root" -Komponente erstellen und dann müssen Ihre beiden Komponenten untergeordnete Elemente dieser Root-Komponente sein.

Es sieht so aus, als ob beim Laden mit Lazy die Provider in Ihrem Modul zum Injektor der Komponente im Stammverzeichnis Ihres Moduls hinzugefügt werden. Da Sie zwei "Root-Komponenten" haben, haben sie jeweils separate Instanzen der Services.

Die Lösung bestand darin, eine einzelne Root-Komponente zu erstellen, deren Injektor die Lazy-Loaded-Services erhält, die dann von allen untergeordneten Komponenten gemeinsam genutzt werden können.

1

einfach Ihre LazyModuleService als Anbieter in Ihrem LazyLoadedModule hinzuzufügen. Sie können es nur in den Komponenten in diesem Modul verwenden.

+0

Sie haben Recht. –

+1

Nein, das funktioniert nicht. Wie ich in meiner Frage gesagt habe, so habe ich es und es funktioniert nicht. – FlashBanistan

Verwandte Themen