AngularJS在其文档中明确指出“服务是单例”:
AngularJS services are singletons
违反直觉,module.factory也返回一个Singleton实例。
module.factory
鉴于非单例服务有很多用例,实现工厂方法以返回Service实例的最佳方法是什么,以便每次ExampleService声明依赖项时,它的另一个实例都可以满足ExampleService?
ExampleService
我认为我们不应该让工厂返回一个有new能力的函数,因为这会开始破坏依赖注入,并且该库的行为会很尴尬,尤其是对于第三方。简而言之,我不确定非单项服务是否有合法的用例。
new
完成同一件事的更好方法是使用工厂作为API,以返回带有附加的getter和setter方法的对象集合。以下是一些伪代码,显示了使用这种服务的工作方式:
.controller( 'MainCtrl', function ( $scope, widgetService ) { $scope.onSearchFormSubmission = function () { widgetService.findById( $scope.searchById ).then(function ( widget ) { // this is a returned object, complete with all the getter/setters $scope.widget = widget; }); }; $scope.onWidgetSave = function () { // this method persists the widget object $scope.widget.$save(); }; });
这只是伪代码,用于通过ID查找小部件,然后能够保存对记录所做的更改。
这是该服务的一些伪代码:
.factory( 'widgetService', function ( $http ) { function Widget( json ) { angular.extend( this, json ); } Widget.prototype = { $save: function () { // TODO: strip irrelevant fields var scrubbedObject = //... return $http.put( '/widgets/'+this.id, scrubbedObject ); } }; function getWidgetById ( id ) { return $http( '/widgets/'+id ).then(function ( json ) { return new Widget( json ); }); } // the public widget API return { // ... findById: getWidgetById // ... }; });
尽管没有包含在此示例中,但这些灵活的服务也可以轻松管理状态。
我现在没有时间,但是如果有帮助,我可以稍后整理一个简单的Plunker进行演示。