2016-05-23 17 views
15

Nehmen wir an, ich habe diese Angular 2 Service:Angular 2 Pass Parameter auf Service Constructor

@Injectable() 
class Demo { 
    constructor(private instanceSpecificString: string) { 
    } 
} 

Beachten Sie, dass Konstruktor eine Instanz spezifische Zeichenfolge akzeptiert. Was ich damit meine ist, dass ich diesen Dienst mehrmals instanziieren möchte und jedes Mal, wenn er instanziiert wird, möchte ich eine andere Zeichenfolge basierend auf dem Kontext übergeben, in dem der Dienst instanziiert wird.

Wie mache ich das?

P.S. string wird als Beispiel verwendet, aber der Parameter könnte leicht vom Typ number oder boolean oder sogar irgendeine Art von Konfiguration object sein.

Antwort

2

Der Wert, der an Ihren Dienst weitergegeben wird, wird vom Injektor bestimmt, der ihn instanziiert. Sie könnte der Lage sein, diese Definitionen in einer Ihrer Komponente zu tun:

@Component({ 
    ... 
    providers: [ 
     provide(string, {useValue: "someSpecificValue"}) 
    ] 
}) 

Dies hat jedoch das Problem, dass Sie einen Anbieter für die Zeichenfolge sind definiert, Token und dass zu Wartbarkeit Problemen führen könnte.

Es wäre wahrscheinlich ein besseres Muster sein, einige Konfigurationsmodelle für Ihren Dienst zu definieren:

class DemoConfig { 
    instanceSpecificString: string; 
} 

Und dann könnte man eine Instanz, dass erstellen, um Ihren Dienst zu übergeben.

let config = { instanceSpecificString: "someSpecificValue" } 

@Component({ 
    ... 
    providers: [ 
     provide(DemoConfig, {useExisting: config}) 
    ] 
}) 

Ich hoffe, dies ist hilfreich. Ich habe das selbst nicht versucht; Die Dienste, die ich in meiner Anwendung verwende, sind Singletons. Hier ist der Hinweis, dass ich mit:

https://angular.io/docs/ts/latest/api/core/index/provide-function.html

+0

Was passiert, wenn mein Dienst eine transitive Abhängigkeit von der Komponente ist? Kann ich 'provide' noch verwenden? – battmanz

+0

Angular2 verwendet ein hierarchisches Injektorsystem, dh wenn ein Injektor eine Instanz Ihres Dienstes erstellt, sucht er nach dem nächstgelegenen Anbieter für das Token, das von Ihrem Dienst benötigt wird. Wenn es keine Definition im Injektor findet, wird es den Elterninjektor prüfen, bis zum Wurzelinjektor. https://angular.io/docs/ts/latest/guide/hierarchical-dependency-injection.html – awiseman

+0

Woher kommt die Funktion "provide()"? – OddDev