2017-01-25 3 views
0

Ich habe eine Komponente, die 2 Dienste verwenden.angular2 service instancied 2 mal

export class UseComponent {  
    constructor(private _service1: Service1, 
       private _service2: Service2){} 

Der zweite Dienst benötigt eine Methode, die in einem ersten Dienst vorhanden ist. somit injizieren I auch die fisrty Dienst in zweiten

export class Service2{ 

constructor(private _service1: Service1) {}; 

getLabel(): string{ 
    return this._service1.getLanguageLabel(); 
} 

Provider für den Service in einem Modul

@NgModule({ 
    imports: [.....], 
    declarations: [.....], 
    providers: [Service1, Service2] 
    }) 
    export class UseModule { } 

wenn die UseComponent die Methode getLabel verwendet, wird die service1 instancied wieder (erste Instanziierung, wenn die Komponente wird initialisiert)

Warum diese zweite Instanziierung? Wie man es vermeidet?

+0

haben Sie den Provider in UseComponent festgelegt? –

Antwort

1

Werke im Allgemeinen: https://plnkr.co/edit/pWgQ5iVNVVGmHBZsv2SD?p=preview

darauf, dass diese Dienste sind nicht in anderen module ‚s Anbieterliste.

@Injectable() 
export class Service1 { 

    constructor() { 
    addLog('created service 1'); 
    } 

    public anyFunc() { 
    return "huhu"; 
    } 
} 

@Injectable() 
export class Service2 { 

    constructor(private _srv1: Service1) { 
    addLog('created service 2'); 
    } 

    public anyFunc() { 
    return this._srv1.anyFunc(); 
    } 
} 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>Hello {{name}}</h2> 
    </div> 
    <p *ngFor="let log of logs | async">{{log}}</p> 
    `, 
}) 
export class App { 
    name:string; 
    private logs = logs; 

    constructor(private _srv2: Service2) { 
    this.name = 'Angular2' 

    addLog(this._srv2.anyFunc()); 
    } 
} 

@NgModule({ 
    imports: [ BrowserModule ], 
    declarations: [ App ], 
    providers: [Service1, Service2], 
    bootstrap: [ App ] 
}) 
export class AppModule { }