2016-02-05 5 views
6

Wir arbeiten hier an ziemlich großen App in TypScript und Angular 2 geschrieben und ich habe ein großes Problem zu verstehen, wie zu Verwenden Sie Angular 2 Injector in einer benutzerdefinierten Weise. Eigentlich bin ich mir nicht sicher ob ich versuche etwas zu tun, was nicht vom Framework beabsichtigt ist, aber bis jetzt habe ich nur schlechte Lösungen gefunden, was ich versuche zu tun ...Angular 2 - wie Abhängigkeiten zu benutzerdefinierten Klasse zu injizieren, die keine Komponente und nicht als Service verfügbar ist

Also, was ich versuche zu erreichen besteht darin, Werte aus Injector auf Klassen anzuwenden, die nicht das Verhalten von @Component enthalten und nicht Injektoren als Dienste ausgesetzt sind, die globalen Injektoren oder Injektoren auf Komponentenebene zugeordnet sind. (Ich glaube, ich verstehe ganz gut, wie man Zeug in diese beiden Bereiche injiziert und das funktioniert ganz gut).

Was ich versuche, ist so etwas wie diese:

export class SomeCustomClass { 
    constructor(injection:InjectionToken) { 
     console.log('injection', injection); 
    } 
} 

Und ich weiß, dass wenn ich diese Klasse hinzufügen würde innerhalb Bootstrap oder als Teil zum Injektor wenn @component Dekorateur, die schön funktionieren würde, . Das Problem ist, dass es nicht das ist, was ich vorhabe.

Was ich brauche, ist so etwas wie:

factory.createInstanceWithInjectionApplied(SomeCustomClass); 

Ich konnte tatsächlich mit einfachen leben:

var instance:SomeCustomClass = new SomeCustomClass(); 

Aber das ist nicht realistisch zu sein scheint.

Oh, und ja, ich habe schon alles ausprobiert - @Injectable() tue nichts auf solchen Instanzen, Injector.createAndResolve scheint auch nicht zu funktionieren und hält eine Art statische Eigenschaft mit Zugriff auf Anwendung Injector scheint auch keine gute Idee.

Vielen Dank im Voraus!

+0

Haben Sie schon gefunden, eine Lösung? – Matey

Antwort

0

Versuchen Sie die Klasse Injector zu verwenden? Hier

ist ein Beispiel:

var injector = Injector.resolveAndCreate([Car, Engine]); 
var car = injector.get(Car); 

und ein anderes:

export class SomeCustomClass { 
    constructor(injector:Injector) { 
    (...) 
    } 
} 
+0

Das würde brandneue Injektor ohne Bezug auf Eltern, die kann und tatsächlich injiziert es selbst, aber nicht etwas, was bereits definiert ist in Haupt 'Injector' erstellen. – zii

+0

'var injector = appInjector.resolveAndCreateChild ([SomeCustomClass]); injektor.get (SomeCustomClass)); ' Macht den Trick. Das würde auch eine bestehende Bezugnahme auf den Anwendungsinjektor erfordern, was eine tatsächlich unvermeidliche Bedingung ist, um injizierte Werte davon anzuwenden. Danke, ich denke ich habe es jetzt klar! – zii

+0

Sie können eine Instanz des App-Injektors auf der Bootstrap-Ebene abrufen: 'bootstrap (AppComponent) .then ((componentRef) => {console.log (componentRef.injector);});'. Sie müssen dann einen Weg finden, um es dort bereitzustellen, wo Sie es verwenden möchten ... –

Verwandte Themen