2016-10-24 8 views
1

アングル2のシングルトンサービスについて少し混乱しています。アプリケーション全体で翻訳サービスが必要です。サービスのインスタンスは1つだけです。私は言語を切り替える2つのボタンがあります。私は、アプリケーションを実行すると、私はコンテンツを翻訳するパイプを使用し、それは動作しますが、スイッチのボタンは動作しません。アングル2のシングルトンサービス

self.parent.context.use is not function 'というエラーメッセージが表示されます。

私はいくつかの角度の概念について誤解されているので、誰でも私が正しくグローバルサービスを実装するのを手伝ってくれますか? Angular2サービスで

//Translation service 
 
@Injectable() 
 
export class TranslateService { 
 
    private _currentLang: string; 
 

 
    constructor(){ 
 
    this._currentLang = 'es'; 
 
    } 
 

 
    public get currentLang() { 
 
    return this._currentLang; 
 
    } 
 

 
    public use(lang: string): void { 
 
    // set current language 
 
    this._currentLang = lang; 
 
    } 
 

 
    private translate(obj : LocalizedData): string { 
 
    // private perform translation 
 
    return obj[this._currentLang]; 
 
    } 
 

 
    public instant(obj: LocalizedData) { 
 
    // call translation 
 
    return this.translate(obj); 
 
    } 
 
} 
 

 
//Navbar Module 
 
@NgModule({ 
 
    imports:  [ CommonModule, FormsModule], 
 
    declarations: [ NavbarMenuComponent, TranslatePipe], 
 
    exports: \t \t [ NavbarMenuComponent] 
 
}) 
 

 
export class NavbarModule { } 
 

 
//App component 
 
@Component({ 
 
    selector: 'app', 
 
    template:'<navbar-menu ></navbar-menu>' 
 
}) 
 

 
export class AppComponent implements OnInit{ 
 
    public translatedText : string; 
 
    constructor(){} 
 
    ngOnInit(){} 
 
    } 
 

 
//app Module 
 
@NgModule({ 
 
    imports:  [ BrowserModule, FormsModule, NavbarModule], 
 
    declarations: [ AppComponent], 
 
    bootstrap: [ AppComponent], 
 
    providers: \t [ TranslateService], 
 
}) 
 

 
export class AppModule { } 
 

 

 
//Main 
 
const platform = platformBrowserDynamic(); 
 
platform.bootstrapModule(AppModule,[ TranslateService]); 
 

+0

デフォルトでは、すべてのサービスはangle2ではシングルトンです。ドキュメント「Singleton services」から。依存関係はインジェクタのスコープ内のシングルトンです。 – Igor

+0

あなたは、正確にどこを見ているかを示す命令を提供するか、[最小限の、完全で検証可能な例を提供する](http://stackoverflow.com/help/mcve) )に焦点​​を当てて「Minimal」に焦点を当てた。上記のようなすべてのコードを提供すると、あなたの質問に多大な騒音が加わります。 – Igor

答えて

3

プロバイダごとにシングルトンです。サービスを複数回提供すると、複数のインスタンスが取得されます。

あなたは

@NgModule({ 
    providers: [SomeService] 
    ... 
}) 

で、それを提供する場合、それはルートスコープに提供され、あなたがあなたの全体のアプリケーションのための単一のインスタンスを取得します。プロバイダ内に複数のサービスが含まれている場合でも、アプリケーションのルートスコープに格納されているので、インスタンスは1つしか取得できません。

遅延読み込みモジュールには独自のルートスコープがあります。

このようなコンポーネントインスタンスごとに@Component()にサービスを提供すると、その子プロセスは異なるサービスインスタンスを取得します。

+0

お返事ありがとうございます!それは私がドキュメンテーションから断ったものですが、ルートモジュール 'AppModule'でサービスを提供すると、子モジュールとテンプレートのサービスをどのように呼び出すことができますか?私はそれぞれのコンポーネントのコンストラクタにサービスを注入せずにそれを行う可能性がありますか?ルートモジュールにサービスを提供するだけで同じエラーが発生します。 – Miguel

+0

提供すると、サービスのスコープが定義されます。これを使用するには、コンストラクタパラメータを使用して注入する必要があります。 –

+0

@GünterZöchbauerすべてのファイルの先頭に 'yからyをインポートする 'ことを回避する方法はありますか?私はグローバル変数としてロダッシュを持っていたいと思います。 – GFoley83

関連する問題