2017-09-14 1 views
0

私は少し複雑に思えるので、多言語角型アプリケーションのこの単純なアプローチを実装しました。シングルトンインスタンスと新しいインスタンスとの比較対多言語用のTypescriptでの角4角笛アプリケーション

だから我々は、このインターフェイスがあります。

export interface Messages { 

     welcome: string; 
     msg1: string; 
     msg2: string; 

     dynamic: (user: string) => string; 

    } 

をし、我々はこのように、このインターフェイスを使用します。

クラス

import {Messages} from './messages'; 

    export class MessagesEN implements Messages { 

     welcome = 'welcome'; 
     msg1 = 'message one'; 
     msg2 = 'hello second!'; 

     dynamic = (user) => `hi ${user}`; 
    } 

シングルトン

import {Messages} from './messages'; 

    export class MessagesGR implements Messages { 

     private static _INSTANCE: Messages; 

     private constructor() { 
     } 

     static get INSTANCE(): Messages { 
     return this._INSTANCE || (this._INSTANCE = new this()); 
     } 

     welcome = 'καλως ηρθατε'; 
     msg1 = 'μηνυμα ενα'; 
     msg2 = 'ειμαι ο δευτερος!'; 

     dynamic = (user) => `γεια σου ${user}`; 
    } 

のconst var

import {Messages} from './messages'; 

    export const ALB: Messages = { 

     welcome: 'mire se erdhet', 
     msg1: 'mesazhi nje', 
     msg2: 'jam e duta', 

     dynamic: (user) => `si jeni ${user}` 
    }; 

その後、我々はMessagesService持っている:

import {Messages} from './messages'; 
    import {MessagesGR} from './messages.gr'; 
    import {ALB} from './messages.alb'; 
    import {MessagesEN} from './messages.en'; 

    export class MessagesService { 

     messages: Messages; 

     constructor() { 
     const lang = localStorage.getItem('lang'); 
     this.init(lang); 
     } 

     public init(lang: string) { 
     switch (lang) { 
      case 'alb': 
      this.messages = ALB; 
      break; 
      case 'en': 
      this.messages = new MessagesEN(); 
      break; 
      case 'gr': 
      default: 
      this.messages = MessagesGR.INSTANCE; 
     } 
     } 
    } 

をして、コンポーネントのHTMLに、私たちはMessagesServiceを使用しています。 いずれもうまく動作します。

私の質問は優れている方法である(パフォーマンスとメモリ賢明)

  1. のconst VAR(ALB)
  2. クラス(EN)
  3. シングルトン(GR)

答えて

0

角度インジェクタ自然にシングルトンを生成することができます。 Angularでは特別な 'シングルトン'クラスは必要ありません。

クラスが拡張または再インスタンス化されていない場合、特にデータのみを保持し、ロジックがない場合は、クラスを使用する理由はありません。

定数は完全な解決策です。さらに、DIを使用して拡張性のための追加の可能性を提供するために、角度サービスにすることができます。

+0

角型インジェクタは、すべてのクラスを熱心に初期化しますが、これはユーザーにとっては言語を変更しないようにするための最良の方法だとは思いません。 –

+0

注入されるとすぐに遅延して初期化されます。インスタンスの初期化を避けたい場合は、コンストラクタに注入するのではなく、 'injector.get(messageServiceToken)'を使ってインスタンスを取得してください。これは時期尚早の最適化と考えることができます。アプリ内ですべての言語を定義する必要があります。 – estus