Angular bietet nur eine Singleton- Service- / Factory-Option. Eine Möglichkeit besteht darin, einen Factory-Service zu haben, der eine neue Instanz für Sie in Ihrem Controller oder anderen Consumer-Instanzen erstellt. Das einzige, was injiziert wird, ist die Klasse, die neue Instanzen erstellt. Dies ist ein guter Ort, um andere Abhängigkeiten einzufügen oder Ihr neues Objekt gemäß der Spezifikation des Benutzers zu initialisieren (Hinzufügen von Diensten oder Konfiguration).
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);
}
In Ihrer Consumer-Instanz benötigen Sie dann den Factory-Service und rufen die Build-Methode in der Factory auf, um bei Bedarf eine neue Instanz abzurufen
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);
}
}
Sie können sehen, dass es die Möglichkeit bietet, bestimmte Dienste zu injizieren, die im Werksschritt nicht verfügbar sind. Auf der Factory-Instanz kann immer eine Injektion erfolgen, die von allen Model-Instanzen verwendet wird.
Hinweis: Ich musste Code entfernen, damit ich möglicherweise Kontextfehler machte. Wenn Sie ein Codebeispiel benötigen, das funktioniert, lassen Sie es mich wissen.
Ich glaube, dass NG2 die Option haben wird, eine neue Instanz Ihres Dienstes an der richtigen Stelle in Ihrem DOM einzufügen, sodass Sie keine eigene Factory-Implementierung erstellen müssen. muss abwarten und sehen :)