2

Ich habe drei Dienste und eine Komponente:Angular 2 Injekt Komplex Dienst Dienst

  • root.service
  • abstarct-child.service
  • extend-child.service
  • app.component

Die root.service einspritzt von Abhängigkeitsinjektion unter Verwendung von die abstarct-child.service, etwa so:

import {Injectable} from 'angular2/core'; 
import {AbstractChildService} from './abstarct-child.service'; 

@Injectable() 

export class RootService { 
    constructor(private _abstractChildService: AbstractChildService) {} 
    UseChildServiceDoSomethingFunction(){} 
} 

Die abstarct-child.service sieht so aus:

import {Injectable} from 'angular2/core'; 

@Injectable() 
export abstract class AbstractChildService { 
    abstract doSomething(): any ; 
} 

Die extend-child.service sieht so aus:

import {Injectable} from 'angular2/core'; 
import {AbstractChildService} from './abstarct-child.service'; 

@Injectable() 
export class ExtendChildService extends AbstractChildService{ 

    constructor(private _num: number) { super(); } 
    doSomething() : any { return true; } 
} 

Die app.component die root.service und die extend-child.serviceals bietet die abstract-child.service so:

import {Component} from 'angular2/core'; 
import {Input} from 'angular2/core'; 
import {provide} from 'angular2/core'; 
import {RootService} from './root.service'; 
import {AbstractChildService} from './abstarct-child.service'; 
import {ExtendChildService} from './extend-child.service'; 

@Component({ 
    selector: 'app', 
    providers: [provide(AbstractChildService, { useClass: ExtendChildService, useValue: this.num})] 
}) 
export class AppComponent { 
    @Input('given_Num') num: number; 
} 

Ich mag würde wissen, wie kann ich das extend-child.service ein Objekt, in diesem Fall der this.num von app.component injizieren?

Kann jemand finden, was ich falsch mache?

Danke.

Antwort

2

Ich habe noch nicht vollständig herausgefunden, was Sie versuchen, aber

provide(AbstractChildService, { 
     useClass: ExtendChildService, 
     useValue: this.num}) 

ist kein gültiger Anbieter zu erreichen.

können Sie keine useClassunduseValue Parameter in einer Hand haben, eine nur zu einem Zeitpunkt.

Sie können this. auch nicht in einem Provider in einem @Component() Decorator verwenden. Wenn der Decorator ausgewertet wird, gibt es noch keine Instanz der Komponente, auf die sich this. beziehen könnte.

Wenn Sie eine Nummer geben Sie einen String oder ein OpaqueToken

provide('MyNumber', {useValue: 10}), 

verwenden können und es durch

constructor(@Inject('MyNumber') private _num: number) { super(); } 

eine andere Art und Weise verwenden wird, um eine Fabrik injiziert bekommen

provide(ExtendedChildService, {useFactory:() => { new ExtendedChildService(10)}); 

aber this. kann immer noch nicht verwiesen werden.

+0

Wie Sie sehen können, erhalten extend-child.service ein Number-Objekt durch Dependency-Injection, ich werde eine Nummer zu erweitern-child.service injizieren und dann extend-child.service zu root.service injizieren.vielleicht bin ich das ist ein schlechter weg, also wenn jemand weiß was es richtig ist? –

+0

Wie in meiner Antwort erwähnt, können Sie eine Nummer nicht nur nach ihrem Typ eingeben. Für primitive Typen benötigen Sie einen Schlüssel, der sich vom Typ unterscheidet und '@Inject ('someKey')' zum Konstruktor-Parameter hinzufügt. Sonst wäre DI nicht in der Lage, zwischen den angegebenen "string" (number, boolean, ...) Werten zu unterscheiden. –

+0

Nun, ich habe Ihre Antwort, das Problem ist, dass meine app.component den num param injizieren muss, wenn der num param in app.component injiziert wird. –

Verwandte Themen