2017-01-12 3 views
1

Es ist mir klar, wie wir einen Dienst in angular2 einfügen können. Wir können den Service entweder auf Modulebene oder auf Komponentenebene anbieten.Einspritzen von komponentenspezifischen Werten in einen Angular2-Dienst

Ich möchte dem Dienst eine bestimmte Eigenschaft hinzufügen, bevor dieser Dienst wiederum in meine Komponente injiziert wird. Die fragliche Eigenschaft hängt von meiner Komponente ab. Wie kann dies in Angular 2 erreicht werden?

Beispiel:

@Injectable() 
export class MyService { 
    constructor(myProperty: String) { 
    setSomethingUsingMyProperty(myProperty) 
    } 
} 

@Component(..., {providers: [MyService] }) 
export class MyComponent { 
    constructor(myService: MyService) { 
    myService.doSomething() 
    } 
} 

Wenn i die Eigenschaft in der darüberliegenden Modul bereitzustellen, dann nehme ich an Angular2 die Eigenschaft injizieren kann, wenn i die @Inject Richtlinie umfasst. Aber wie kann dies auf der Komponentenebene erreicht werden?

Antwort

3

Sie können string name wie

@Injectable() 
export class MyService { 
    constructor(@Inject('someName') myProperty: String) { 
    setSomethingUsingMyProperty(myProperty) 
    } 
} 
@Component({..., 
    providers: [MyService, {provide: 'someName', useValue: 'someValue'}] }) 
export class MyComponent { 
    constructor(myService: MyService) { 
    myService.doSomething() 
    } 
} 
+0

Ich hatte vermutet, liefern und injizieren, dass die Bereitstellung mit 'useValue' nur MyComponent gelten würde, zum Beispiel, wenn der MyComponent Konstruktor eine Injektion anfordert von 'someName'. Wie kommt es, dass dies die DI-Anforderung von MyService löst? Was würde passieren, wenn ich eine Komponente MySecondComponent in MyComponent einfügen würde, die sich selbst bereits mit einem anderen Wert 'someName' anbietet? Vielen Dank für Ihre Unterstützung. –

+1

Wenn Sie "MyService" auf '@ NgModule' anstelle von' @ Component' bereitstellen, würde dies nicht funktionieren. Wenn DI eine Instanz eines Providers erstellt, startet es bei anderen Anbietern desselben Injektors (in meiner Antwort ist dies der Injektor der Komponente), wenn er keinen Provider findet, schaut er auf den Eltern-Komponenteninjektor, bis er erreicht ist AppComponent'. Wenn dort kein Provider gefunden werden kann, sucht er nach den von '@ NgModule' bereitgestellten Providern. In meiner Antwort. Der Provider wird an der ersten Stelle gefunden, an der er gesucht wird, und es wird injiziert. Sie können andere Komponenten außer einem Elternteil nicht injizieren. –

+1

Wenn das übergeordnete Element "someName" bereitstellt, die aktuelle Komponente jedoch nicht, wird es gemäß der obigen Regel an der zweiten Position gefunden, an der DI danach sucht. –

Verwandte Themen