AngularJs的内置服务有很多,例如
AngularJs提供了三种方法可以自定义服务,分别是provider、factory、service.
那么他们都是怎么定义?怎么调用?有什么区别和联系?我们一起来看看.
一.service
1.有返回值写法
@H_502_41@angular.module('myTestApp') .service('TestService',function () { var TestService = {}; TestService.getTestString = function () { return "success"; } return TestService; })2.无返回值写法,需要加this参数
@H_502_41@angular.module('myTestApp') .service('TestService',function () { this.getTestString = function () { return "success"; } });3.调用(需要注入TestService)
@H_502_41@angular.module('myTestApp') .controller('state1Ct',function ($scope,TestService) { $scope.testStr = TestService.getTestString(); });二.factory
通过factory方法创建的服务必须有返回值,即必须有return函数,它可以返回任意类型的值,包括基本数据类型或者对象类型。
如果没有return函数,则会报错。
factory注入的结果就是return返回的结果,可以在被注入的对象中使用注入的结果定义的各种方法.
@H_502_41@angular.module('myTestApp') .factory('UtilFactoryService',function () { var factory = {}; factory.getTestString = function () { return "factory success"; }; return factory; //这里返回的是factory 包含2个方法 }) ;使用方法和service相同
三.provider
通过provider方法创建的服务一定要包含
在三种创建服务的方法中,只有使用provider方法创建的服务才可以传进config函数,以用于在对象启用之前,对模块进行配置。但是在config中进行配置的只能是在$get函数之外定义的变量,在下面定义的provider中只有artist与thingFromConfig两个变量可以被访问到,而getArtist与getThingFromConfig两个方法是不能被在config函数中访问到的。
而且在注入config函数中时,参数名必须由服务名+Provider组成,例如下面的例子注入到config函数中的就是myProviderProvider
@H_502_41@app.controller('myCtrl',['$scope','myProvider',function ($scope,myProvider) { console.log(myProvider.getThingFromConfig()); //kingx name }]); app.provider('myProvider',function () { this.artist = ''; this.thingFromConfig = ''; this.$get = function () { var that = this; return { getArtist: function () { return that.artist; },getThingFromConfig: function () { return that.thingFromConfig; } } }; }); app.config(function (myProviderProvider) { //注意这里参数的名字 myProviderProvider.thingFromConfig = 'kingx name'; });三种方法的比较
需要在config中进行全局配置的话,只能选择provider方法 factory和service是使用比较频繁的创建服务的方法。他们之间的唯一区别是:service方法用于注入的结果通常是new出来的对象,factory方法注入的结果通常是一系列的functions provider是创建服务最为复杂的方法,除非你需要创建一个可以复用的代码段并且需要进行全局配置,才需要使用provider创建 所有具有特定性目的的对象都是通过factory方法去创建