2016-01-04 13 views
6

Ich versuche, die Notwendigkeit der Zugabe des @Injectable() Dekoration in Dienstleistungen in Winkel 2.Angular 2 @Injectable() - wie es funktioniert

Aus der Dokumentation zu verstehen: https://angular.io/docs/ts/latest/guide/dependency-injection.html

Warum don‘ t fügen wir @Injectable() zur HeroesComponent hinzu? Wir können es hinzufügen, wenn wir es wirklich wollen. Dies ist nicht notwendig, da die HeroesComponent bereits mit @Component versehen ist. TypeScript generiert Metadaten für jede Klasse mit einem Dekorator, und jeder Decorator tut dies.

Also im Grunde brauchen Sie nur @Injectable() hinzufügen, wenn keine andere Dekoration verfügbar ist, denn wenn es eine Dekoration jeglicher Art zur Verfügung steht, wird der Typoskript Compiler automatisch Abhängigkeitsinformationen erzeugen, die auf den Variablen basiert, die Sie im Konstruktor zB übergeben .: constructor(private logger: Logger)

Ist das richtig? Danke

+5

Das ist richtig .. – alexpods

+5

Ich lol'd @alexpods. Was ist mit dem Hinzufügen als Antwort: D? Um ein wenig zu ergänzen, können Sie dies lesen [Kommentar] (https://github.com/angular/angular/issues/4404#issuecomment-143920530), das ganze Thema ist interessant, aber nicht ganz auf Ihre Frage bezogen. –

Antwort

7

Ich denke, der Name ist ein bisschen seltsam und ich verstehe wirklich nicht, warum sie sagen, dass Sie es für Best Practice hinzufügen. Wenn ich es zu jeder Klasse als Best Practice hinzufüge, verstehe ich nicht, warum es überhaupt benötigt wird. Es wäre einfacher, das Framework jede Klasse überprüfen zu lassen, wenn der Konstruktor benötigt wird, oder nicht. Dies könnte mit einer Kommandozeilen-Eigenschaft auf Typoskript gelöst worden sein, um immer (Schein-) Metadaten zu erzeugen.

Der Ratschlag, es immer hinzuzufügen, ich denke, ist ähnlich dem Compiler haben immer Metadaten hinzufügen (was nicht möglich ist, soweit ich weiß). Du könntest es (mit Wachsamkeit) nur (und immer) zu den Klassen hinzufügen, die Zeug brauchen - selbst wenn sie einen anderen Dekorator haben. Das wäre wahrscheinlich die eindeutigste Lösung - aber hey - schlampig zu sein kann sowohl eine schlechte als auch eine gute Sache sein. Sie werden in diesem Fall der Richter sein.

TL; DR Wenn Sie keine anderen Dekorateure habenUND Sie, wenn Konstruktor Dienste benötigt/etc injiziert, dann Sie es brauchen.

+1

Um dies zu verdeutlichen, ist es nicht notwendig für Klassen, die andere Klassen-Dekoratoren haben, die von 'Injectable' (' Component', etc) ** oder ** für Klassen, deren Konstruktor-Eigenschaften mit 'Inject' versehen sind, erweitert werden (zB in ES.next) Code). – estus