2017-01-25 10 views
0

私は2つのサービスを使用するコンポーネントを持っています。angular2 service instancied 2 times

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

第2のサービスは、第1のサービスに存在するメソッドを必要とする。 UseComponentメソッドgetLabelを使用する場合、サービス1は、(最初​​のインスタンス化ときコンポーネント再びinstanciedされるサービスのプロバイダ第

export class Service2{ 

constructor(private _service1: Service1) {}; 

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

でfisrtyサービスモジュールに

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

あり、したがってIはまた、注入します

なぜこの2回目のインスタンス化ですか?それを避ける方法は?一般的には

+0

UseComponentにプロバイダを設定しましたか? –

答えて

1

作品:https://plnkr.co/edit/pWgQ5iVNVVGmHBZsv2SD?p=preview

これらのサービスは、他のmoduleのプロバイダリストに含まれていないことに注意してください。

@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 { }