2016-08-09 157 views
4

Ich habe ein paar Probleme zu verstehen, wie man einen Dienst in angular2 korrekt erweitert, vielleicht weil ich nicht gut verstehe, wie man eine Klasse in Typoskript erweitert.angular2 Service mit Argument im Konstruktor erweitern

Oberklasse

@Injectable() 
export class CallService{ 
    constructor(private errror:string){ 
     this.errMsg=errror; 
    } 
    private _errMsg:string; 
    set errMsg(arg0:string){ 
     this._errMsg=arg0; 
    } 
    get errMsg():string{ 
     return this._errMsg; 
    } 
} 

SubClass

@Injectable() 
export class DownloadService extends CallService{ 
    constructor(private error:string,private http:Http){ 
     super(error) 
    } 
} 

App.Component

@Component({ 
selector:'my-app', 
    templateUrl:'app/app.component.html', 
    styleUrls:['app/app.component.css'], 
    directives:[ROUTER_DIRECTIVES,WaitComponent], 
    providers:[DownloadService,SwitcherService,CallService,WaitService] 
}) 
export class AppComponent{ 
    title:'App' 
    constructor(
     private areadownloadservice:AreaDownloadService, 
     private waitService:WaitService, 
     private switcherservice:SwitcherService, 
     private callService:CallService){} 
    ) 
} 

Was ich tun möchte, ist, einige Klassen mit callservice zu erweitern, so dass alle Klassen, die eine Anruf tätigen wird eine errMsg string -Eigenschaft zu setzen oder zu bekommen, aber ich bekomme diese Ausnahme:

Kein Anbieter für String!

Was habe ich verpasst?

+0

Das Problem ist keine Unterklasse. Die Annotation vom Typ "string" im Konstruktor bewirkt, dass der Injektor nach dem "string" -Provider sucht, und es gibt keinen, und in der Komponente ist auch kein Provider für "error" definiert. – estus

+0

ok, und was ist der richtige Weg, um einen Service auf die Art und Weise zu erweitern, wie ich oben schreibe? – mautrok

+0

Was möchten Sie, dass Angular DI in den Parameter 'error' geht? –

Antwort

4

Sie können entweder

  • entfernen Sie den error Parameter

  • machen den error Parameter optional

export class CallService{ 
    constructor(@Optional() private errror:string){ 

... 

export class DownloadService extends CallService{ 
    constructor(@Optional() private error:string,private http:Http){ 
  • oder DI sagen, was es
bootstrap(AppComponent, [HTTP_PROVIDERS, {provide: 'someToken', useValue: 'someStringValue'}]) 
export class CallService{ 
    constructor(@Inject('someToken') private errror:string){ 

... 

export class DownloadService extends CallService{ 
    constructor(@Inject('someToken') private error:string,private http:Http){ 

Sie können auch eine OpaqueToken anstelle der String-Schlüssel ('someToken') verwenden passieren sollte.
Siehe auch http://blog.thoughtram.io/angular/2016/05/23/opaque-tokens-in-angular-2.html

2

An dieser Codezeile constructor(private error:string,private http:Http){ Sie den Konstruktor sagen eigentlich für die Http und string Dienste vorzubereiten, aber Sie haben nicht so ein string Dienst überall erklärt.

+0

es ist auch eine gute Antwort, es erklärt den Fehler wirklich gut, aber Gunter schrieb eine vollständigere Lösung – mautrok