2016-11-29 14 views
0

すべてのアプリのためのサービスが、それは(私がAngular2でES6を使用しています)の書き込みにかなり不快です:すべてのコンポーネントやサービスに角度2 1、私は私のAngular2アプリでロガーサービスを使用する必要が

import { LoggerService } from '../services/logger-service'; 
... 
constructor(@Inject(LoggerService) logger) { 
    this.logger = logger; 
} 

私はそれを使いたい。グローバルにLoggerServiceを注入してアプリ内のどこでも使用する方法はありますか?私はそれを行う方法を見つけていない。

これは私のロガーがどのように見えるかです:

私はそれを使用したい
import {Injectable} from '~/node_modules/@angular/core'; 

@Injectable() 
export class LoggerService { 
    constructor() { 
     if (appConfig.dev) { 
      this.log = console.log.bind(console); 
      this.error = console.error.bind(console); 
      this.info = console.info.bind(console); 
     } else { 
      this.log = this.error = this.info =() => null; 
     } 
    } 
} 

とコンポーネントの例:あなたがしようとしている場合の解決策の

import { Component, Inject } from '~/node_modules/@angular/core'; 
import { LoggerService } from '../services/logger-service'; 

@Component({ 
    'selector': 'activities', 
    'template': template, 
    'styles': [style] 
}) 
export class ActivitiesComponent { 
    constructor(@Inject(LoggerService) logger){ 
     this.logger = logger; 
    } 

    someAction() { 
     this.logger.log('hello'); 
    } 
} 
+1

ありハックがありますが、私はあなたがそれらを使用し、ちょうどあなたがそれを必要な場所にそれを注入してはならないと思います。 –

+0

継承の使用はどうですか? – echonax

+0

@GünterZöchbauerあなたはいくつかの例を教えていただけますか?たとえそれがハッキングの方法であっても、それは将来の読者と私に角度2 DIスチレンをより良く理解させるのに役立つでしょうか? – kemsbe

答えて

1

一つは、継承を使用することですすべてのコンポーネントの中で同じことをやってください。

あなたのスーパークラスは次のようになります。

constructor(private injector: Injector) { 
    super(injector); 
    } 

あなたは再び内部注入器を記述する必要があります。

export abstract class BaseComponent implements OnInit{ 

ls:LoggerService; 
constructor(private injector: Injector){ 
    console.log("I'm super: inside constructor"); 
    this.ls = this.injector.get(LoggerService); 
    this.ls.logger("Super Class log!"); 
} 
    ngOnInit(){ 
    console.log("I'm super, inside OnInit"); 
    } 
} 

と内側に、あなたはあなたのスーパークラスを初期化することができ、このようなあなたの子クラスのコンストラクタコンストラクタを毎回(そして、@Günterhere https://stackoverflow.com/a/39038814/5706293で述べたようないくつかの悪い理由がありますが)この注射可能なもの(あなたのケースではロガー)で同じことをするつもりなら、これが最善の解決策になると思います。

全例:http://plnkr.co/edit/7qRjjgPI6XvOAzrKhWbV?p=preview

関連する問題