2017-10-04 4 views
1

Ich habe einen Dienst A. Dieser Dienst bekommt einen anderen Dienst B injiziert. So A verwendet B. B wird von A verwendet und in As Konstrukt injiziert.Angular 2: Dienst injiziert Dienst, Provider

In einer Komponente verwende ich Dienst A. ich nicht direkt Dienst verwenden B. Aber A nutzt B, weil B in A eingespritzt wird

In dieser Komponente

providers: [A, B] 

setzen ich brauche Wenn Ich gebe nur A in Provider ich bekomme

"ERROR: No provider for B" 

in der Javascript-Konsole des Browsers. Ich erhalte keinen Compilerfehler.

Gibt es eine Möglichkeit, weitere Dienste zu verbergen, die nicht direkt im Komponentenanbieter verwendet werden?

Ich mag es nicht, B in den Komponentenanbieter und nicht direkt mit ihm zu verwenden.

Danke!

EDIT

ich alle Dienste in das Modul-Anbieter setzen und dann muss ich sie nicht in irgendeiner Komponente richte ich einen Dienst nutzen. Aber hat dies negative Auswirkungen?

+1

Sie können den Dienst B im Modul bereitstellen, damit Sie ihn nicht bei jeder Komponente angeben müssen. – omeralper

+1

DI stellt die Provider zur Verfügung. Jede Komponente und jedes Modul hat einen eigenen Injektor. Wenn der Injektor den Provider nicht finden kann, fragt er seinen übergeordneten Injektor bis zum Modul ab.Die Verwendung von Dienst B im Dienst A bedeutet nicht, dass Dienst B bereitgestellt wird. Komponente oder Modul muss es bereitstellen. – omeralper

Antwort

1

Scheint, wie Sie nicht vollständig verstehen, wie DI in Angular funktioniert ... Bitte lesen Sie https://angular.io/guide/hierarchical-dependency-injection#injector-bubbling

Lange Rede kurzer Sinn:

  • @NgModule({providers:[]}) export class AppModule{} in gesamten Anwendung verfügbar sind
  • @NgModule({providers:[]}) export class UserModule sind in allen @Component s und @Injectable s, die im aktuellen Modul registriert sind
  • @Component({providers:[]}) sind in dieser Komponente (und ch Idren, aber es gibt einige Ausnahmen)
  • @Component({providers:[]}) schafft neuen Injektor. In der Praxis bedeutet das, dass wenn Sie 3 Komponenten auf Ihrer Seite haben, jeder eine neue Instanz des injizierten Dienstes hat. I.e. In diesem Fall teilen Sie nichts zwischen den Komponenten. Diese Funktion wird selten benötigt ...
  • Wenn Injector löst DI Baum es sucht nach OWN registriert @Injectables, wenn nichts gefunden wird, dann fragt es Eltern. Das heißt also, wenn Sie Service1 haben, hängt das von Service2 ab, also muss Service2 entweder in @Component oder in @NgModule bereitgestellt werden und Angular wird immer noch in der Lage sein, DI-Baum aufzulösen.
  • Es gibt keine Nachteile davon, @Injectable s in @NgModule zu setzen, außerdem ist das "Angular Way". Einzelne @Component({providers:[]}) in den meisten Fällen zu haben ist Overkill und sollte theoretisch Ihre App verlangsamen. Verwenden Sie es daher nur, wenn Sie wirklich eine neue Instanz des Dienstes für jede Komponente benötigen.
Verwandte Themen