angular は、シングルトンサービス/ファクトリ オプションのみを提供します。これを回避する 1 つの方法は、コントローラーまたは他のコンシューマー インスタンス内に新しいインスタンスを構築するファクトリー サービスを用意することです。注入されるのは、新しいインスタンスを作成するクラスだけです。これは、他の依存関係を注入するか、新しいオブジェクトをユーザーの仕様に合わせて初期化する (サービスまたは構成を追加する) のに適した場所です。
namespace admin.factories {
'use strict';
export interface IModelFactory {
build($log: ng.ILogService, connection: string, collection: string, service: admin.services.ICollectionService): IModel;
}
class ModelFactory implements IModelFactory {
// any injection of services can happen here on the factory constructor...
// I didnt implement a constructor but you can have it contain a $log for example and save the injection from the build funtion.
build($log: ng.ILogService, connection: string, collection: string, service: admin.services.ICollectionService): IModel {
return new Model($log, connection, collection, service);
}
}
export interface IModel {
// query(connection: string, collection: string): ng.IPromise<any>;
}
class Model implements IModel {
constructor(
private $log: ng.ILogService,
private connection: string,
private collection: string,
service: admin.services.ICollectionService) {
};
}
angular.module('admin')
.service('admin.services.ModelFactory', ModelFactory);
}
次に、消費者インスタンスでファクトリーサービスが必要になり、ファクトリーでビルドメソッドを呼び出して、必要なときに新しいインスタンスを取得します
class CollectionController {
public model: admin.factories.IModel;
static $inject = ['$log', '$routeParams', 'admin.services.Collection', 'admin.services.ModelFactory'];
constructor(
private $log: ng.ILogService,
$routeParams: ICollectionParams,
private service: admin.services.ICollectionService,
factory: admin.factories.IModelFactory) {
this.connection = $routeParams.connection;
this.collection = $routeParams.collection;
this.model = factory.build(this.$log, this.connection, this.collection, this.service);
}
}
ファクトリ ステップでは利用できない特定のサービスを注入する機会を提供することがわかります。すべての Model インスタンスで使用されるように、ファクトリ インスタンスでいつでも注入を行うことができます。
一部のコードを削除する必要があったため、コンテキストエラーが発生した可能性があることに注意してください...動作するコードサンプルが必要な場合はお知らせください。
NG2 には、DOM の適切な場所にサービスの新しいインスタンスを挿入するオプションがあるため、独自のファクトリ実装を構築する必要はありません。待って見る必要があります:)