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