2017-11-19 2 views
1

Nach Angular Docs können Sie ein anderes Objekt injizieren, wenn ein Provider benötigt wird. Als ich nach guten Gründen suchte, war die folgende Information die folgende:In welchen Fällen kann die Verwendung von "provide" und "useClass" nützlich sein?

Angenommen, eine alte Komponente hängt von einer OldLogger-Klasse [...] ab, aber aus irgendeinem Grund können Sie nicht aktualisieren die alte Komponente, um es zu verwenden.

Ich bin immer noch zweifelhaft. Warum konnte ich in einigen Fällen die alte Komponente nicht aktualisieren? Es ist nicht gefährlich, wenn eine Komponente oder eine Direktive eine Klasse erwartet und wir eine andere injizieren? In welchen Fällen ist die Verwendung von provide und useClass unbedingt erforderlich?

+0

zu verwenden 'useClass' ist die voreingestellte und am häufigsten verwendete Strategie und wird verwendet, wenn Sie Ihre Provider wie folgt definieren: Provider: [MyClass]' -> 'providers: [provide: MyClass, useClass: MyClass]' –

Antwort

1

useClass ist für die Bereitstellung von alternativen Ausführungs

{ provide: MyClass, useClass: MyMockClass } 

was bedeutet, dass, wenn der Typ MyClass des Konstruktors Parameter ist, wo eine Instanz eingespritzt werden soll, ein MyMockClass Instanz statt injiziert wird.

useValue ist Angular eine benutzerdefinierte Instanz Erzeugungslogik

providers: [ 
    DebA, 
    DebB, 
    { provide: MyClass, useValue: (a, b) => new MyClass(a, b), deps: [DepA, DebB] } 
] 

oder

{ provide: 'myServerPort', useValue: 8080 } 

wo Angular würde nicht eine Möglichkeit haben, einen Wert für 'myServerPort' zu liefern, wenn nicht useValue wäre zur Verfügung zu stellen .

2

In meinem Fall benutze ich es, wenn ich andere Logik als eine Standardklasse implementieren muss, die von der eckigen bereitgestellt wird. Zum Beispiel Fehlerbehandler ist eine Standardklasse für Fehler in Angular 2+ Handhabung aber Ich mag meine benutzerdefinierten Klassen verwenden, um Fehler für den Umgang Also ich

{ provide: ErrorHandler, useClass: MyErrorHandler } 

verwenden Es wird die Winkel sagen MyErrorHandler Klasse statt Fehlerbehandler

Verwandte Themen