0

私がAngular 2に移行していて、一時的な依存関係(注入されるコンポーネント間で状態を共有しない依存関係)を作成するためにファクトリパターンを使用する場合は、サービスを登録する最良の方法は何ですかサービスを登録するng2の方法に移行する計画を持つ1.5.8の角度で角度1.5.8から角度2に移行する場合、ファクトリパターンはどのように使用しますか?

私は2番目の角度で分かっていますが、コンポーネントはプロバイダの配列に渡すことでサービスを再インスタンス化できますが、そのオプションは角度1に存在せず、 .factoryのように思われるが、それはあまりにも多くの愛を与えていないので、角度2で非難されている。

たとえば、ユーザがダッシュボードに表示しているタブの状態を管理するTabulationServiceコンポーネント間で状態を共有しません。私はそれが注入される各コンポーネントでサービスを再インスタンス化したいと思うでしょう。しかし、Angular 2のベストプラクティスを使用することを躊躇しているようであれば、.factoryを使用しないでください。

ここで私が頼りにした "ハック"がありますが、私のサービスのヒントとステートレスがタイプされても、作成されるオブジェクトに依存性注入を使用できないそして私はそれが注入されますとき、それが注入されますするコンポーネントは(手動でサービスの状態をクリアすることによって)破壊されたときに私のサービスの状態を管理する必要があります。

tab-manager.service.ts

import { TabManager } from './tab-manager.class'; 
 

 
export class TabService { 
 
    manager; 
 

 
    public initialize(tabs: string[], defaultTab: string) { 
 
    this.manager = new TabManager(tabs, defaultTab); 
 
    } 
 
}

tab-manager.class.ts

import { includes } from 'lodash'; 
 

 
const mandatory = (param) => { throw new Error(`${ param } is a required field in Tab Manager!`) }; 
 
export class TabManager { 
 
    tab: string; 
 

 
    constructor(public tabs: string[] = mandatory(`tabs`), public defaultTab: string = mandatory('defaultTab')) { 
 
    this.checkTab(defaultTab); 
 
    this.tab = defaultTab; 
 
    } 
 

 
    public switchTab(tab) { 
 
    const self = this; 
 

 
    self.checkTab(tab); 
 
    self.tab = tab; 
 
    } 
 

 
    private checkTab(tab: string) { 
 
    const self = this; 
 
    if (!includes(self.tabs, tab)) { 
 
     throw new Error(`{ tab } is not a valid tab. Available tabs are ${ self.tabs.join(',') }`); 
 
    } 
 
    } 
 
}

サービス、その後tab-manager.service.tsからTabManagerサービスをインポートすると `angular.service( 'TabService'、TabManagerService)を呼び出すことによって初期化される

答えて

0

非難するものは何もありませんに角度2のドキュメント。角度1 factoryサービスは、角2 DIでuseFactory providerとして実装されています。

この場合、factoryまたはserviceの場合は、実際には問題になりません。両方が同じ目的を果たすと同じ動作を共有する - それらは、角度1シングルトン同様に、useFactoryuseClassプロバイダは、両方のフレームワーク中に均一に依存し、所望の動作を達成するためにアンギュラ2

において同じ噴射器内シングルトンされているべきです注入後にインスタンス化されます。これは、工場またはコンストラクタ関数で行われている場合、それは本当に問題ではありません - 彼らはそれがなる角度1に対して角度2

の角1またはuseValueプロバイダでvalueサービスとして定義する必要があります。

export class TabulationService { ... } 
export type TTabulationService = typeof TabulationService; 
... 

app.value('TabulationService', TabulationService); 

app.component('some', { 
    controller: class { 
    tabulationService: TabulationService; 

    static $inject = ['TabulationService']; 

    constructor (TabulationService: TTabulationService) { 
     this.tabulationService = new TabulationService(); 
    } 
    } 
}); 

と角2の場合:

providers: [{ provide: TabulationService, useValue: TabulationService }] 
... 

@Component(...) 
export class SomeComponent { 
    tabulationService: TabulationService; 

    constructor (@Inject(TabulationService) TabulationService: TTabulationService) { 
    this.tabulationService = new TabulationService(); 
    } 
} 
+0

ありがとうございます。しかし、これは実際に私が議論していた問題を解決するものではありません。 角度1の「value」プロバイダは依存関係注入を使用できません。 'の使用。私が少なくとも '.service()'でDIを取得しているので、 '.service()'を使うよりも実際にはあまり有利ではありません。問題は、2番目のインポートされたクラスがDIへのアクセス権を持たないため、2番目のクラスをインポートして、新しい '.service()'の中から疑似コンストラクタ関数から新しいものを呼び出さなければならないということです。 私は角度2のドキュメントを "非難"しようとしていませんでした。 ng2は、サービスを工場風にする方法についてはっきりしています。 – roonie

関連する問題