Angular 2 - Dependency Injection und Barreling

8

Ich hatte ein Problem mit der Dependency-Injection, als ich einen Service aus einem Fass importiere ( Ссылка ).

Das Problem, mit dem ich konfrontiert wurde, ist folgendes:

Mit den Angular-Richtlinien, in der App gibt es ein Kern-Fass und dann ein Fass für jeden Ordner, werden diese durch einen Index.ts in jedem Ordner erreicht. Der Core index.ts referenziert alles von jedem Ordner und jeder Ordner verweist auf die spezifischen Dateien.

Kernindex.ts

%Vor%

Testindex.ts

%Vor%

Code

%Vor%

Der obige Code führte zu folgendem Fehler:

Uncaught Cannot resolve all parameters for 'AuthGuard'(undefined). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'AuthGuard' is decorated with Injectable.

Mit Blick auf den Code habe ich kein Problem mit fehlenden @Injectable -Anmerkungen gefunden. Tatsächlich wurde der gleiche Dienst in anderen Komponenten verwendet und mit dem Kernindex.ts importiert.

Ein Artikel Ich habe vorgeschlagen, dass @Inject im Konstruktor verwendet werden sollte, da manchmal, wenn TypeScript in JavaScript konvertiert wird, die Metadaten nicht erstellt werden. Das hat das Problem in meinem Fall nicht gelöst. Nachdem ich einige Dinge ausprobiert habe, habe ich einfach versucht, den Import zu ändern, um den Dienst wie unten zu erhalten, und der Fehler wurde nicht ausgelöst.

Erfolgreiche Einfuhr:

%Vor%

oder

%Vor%

Ich bin mir nicht sicher, ob es ein Problem in den index.ts Dateien in meiner Anwendung gibt oder vielleicht die Dateistruktur selbst ist falsch, aber von dem, was ich sehe, funktionieren sie gut. Würde gerne wissen, warum diese besondere import einen Unterschied macht.

    
Daniel Grima 30.06.2016, 08:29
quelle

2 Antworten

7

Ich hatte genau das gleiche Problem und Günter hat recht: Die Reihenfolge von export s im Fass scheint wichtig zu sein.

In meinem Fall hatte ich in meinem Fass:

%Vor%

was zu dem gleichen Fehler geführt hat, den Sie gesehen haben. Wenn Sie den Dienst vor setzen, löste die Komponente, die ihn verwendet, das Problem:

%Vor%

Ich habe keine Dokumentation darüber gefunden, aber ich finde dieses Verhalten definitiv nicht ideal, weil

  • es ist implizit
  • es ist nicht dokumentiert
  • Die Fehlermeldung gibt Ihnen keine Hinweise, wie Sie sie beheben können
Philip Paetz 19.07.2016, 09:17
quelle
1

Die Reihenfolge ist wie oben angegeben! Nicht sicher, ob es ein Fehler ist oder nicht, aber trotzdem ...

Es sieht also so aus, dass Klassen, die mit Metadaten dekoriert sind, ganz oben im index.ts stehen sollten Wenn einer von ihnen einen anderen injiziert, sollte der "andere" über dem "Eins" stehen.

    
rook 03.09.2016 00:39
quelle

Tags und Links