angular的service与factory
angular里的service是一个单例对象,在应用生命周期结束的时候(关闭浏览器)才会被清除。而controllers在不需要的时候就会被销毁了。
factory是angular里的一种service.
Angular里面创建service最简单的方式是使用factory()方法。
例子
angular.module('myApp.services') .factory('User', function($http) { // injectables go here var backendUrl = "http://localhost:3000";
var service = { // our factory definition user: {}, setName: function(newName) { service.user['name'] = newName; }, }; return service; });
-
什么时候使用factory()方法
在service里面当我们仅仅需要的是一个方法和数据的集合且不需要处理复杂的逻辑的时候,factory()是一个非常不错的选择。
注意:需要使用.config()来配置service的时候不能使用factory()方法
service()通过构造函数的方式让我们创建service,我们可以使用原型模式替代javaScript原始的对象来定义service。
例子
angular.module('myApp.services') .service('User', function($http) { // injectables go here var self = this; // Save reference this.user = {}; this.backendUrl = "http://localhost:3000"; this.setName = function(newName) { self.user['name'] = newName; } this.save = function() { return $http.post(self.backendUrl + '/users', { user: self.user }) } });
service()方法很适合使用在功能控制比较多的service里面
它是一个可注入的构造器,在AngularJS
中它是单例的,用它在Controller
中通信或者共享数据都很合适
在service
里面可以不用返回东西,因为AngularJS
会调用new
关键字来创建对象。但是返回一个自定义对象也不会出错。
注意:需要使用.config()来配置service的时候不能使用service()方法
Factory
它是一个可注入的function
,它和service
的区别就是:factory
是普通function
,而service
是一个构造器(constructor
),这样Angular
在调用service
时会用new
关键字,而调用factory
时只是调用普通的function
,所以factory
可以返回任何东西,而service
可以不返回.
factory
可以返回任何东西,它实际上是一个只有$get
方法的provider
provider
provider
是他们的老大,上面的几乎(除了constant
)都是provider
的封装,provider
必须有一个$get
方法,当然也可以说provider
是一个可配置的factory
例子:
var app = angular.module('app', []); app.provider('movie', function () { var version; return { setVersion: function (value) { version = value; }, $get: function () { return { title: 'The Matrix' + ' ' + version } } } }); app.config(function (movieProvider) { movieProvider.setVersion('Reloaded'); }); app.controller('ctrl', function (movie) { expect(movie.title).toEqual('The Matrix Reloaded'); });
//注意这里config
方法注入的是movieProvider
,上面定义了一个供应商叫movie
,但是注入到config
中不能直接写movie
,
因为前文讲了注入的那个东西就是服务,是供应商提供出来的,而config
中又只能注入供应商(两个例外是$provide
和$injector
),
所以用驼峰命名法写成movieProvider
,Angular
就会帮你注入它的供应商。
1) 用 Factory 就是创建一个对象,为它添加属性,然后把这个对象返回出来。你把 service 传进 controller 之后,在 controller 里这个对象里的属性就可以通过 factory 使用了。
2) Service 是用"new"关键字实例化的。因此,你应该给"this"添加属性,然后 service 返回"this"。你把 service 传进 controller 之后,在controller里 "this" 上的属性就可以通过 service 来使用了。
参考:
https://segmentfault.com/a/1190000003096933
http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider
http://my.oschina.net/tanweijie/blog/295067