@frank-shaw
2016-09-22T03:34:05.000000Z
字数 2061
阅读 2252
angular.js
之前已经提到了angularJS中的依赖service,有很多内置的依赖service,同时我们也可以自定义依赖service。我们来看看怎么做。下文中我们将依赖service成为服务。
服务提供了一种能够在应用的整个生命周期内保持数据的方法。
服务是一个单例对象,在每个应用中只能够被实例化一次,并且是延迟加载的(需要时才会被创建)。
在AngularJS中创建自己的服务是非常容易的:只需要注册这个服务就可以了。注册服务的方式有很多(下面的函数都可以成为服务工厂,即生产服务的函数):
factory()是服务的工厂函数,返回的是一个单例的对象或函数(即服务)。factory()函数接受两个参数:
factory()最为常用,看一个简单例子:
angular.module("myApp-service",[]).factory("githubService",funciton(){var serviceInstance = {};return serviceInstance;});
如何调用呢?我们来看,很简单:
angular.module("myApp",["myApp-service"]).controller("serviceController",function($http, githubService){$scope.events = githubService.serviceInstance;});
这样子就可以了。
值得注意的是:在自定义服务之前注入所有的AngularJS内置服务,这是约定俗成的规则。同时,时刻接的服务在应用的整个生命周期都是单例模式的。
首先介绍一下内置的$provide服务。所有服务工厂都是由$provide服务创建的,$provide服务负责在运行时初始化这些服务工厂。provider()实现的就是内置$provide的功能,而所有服务工厂都构建在provider()方法之上的,可以说factory()、 service()、 constant()、 value()都是provider()方法的简略形式。
provider()必须包含$get()方法。provider()方法有两个参数:
如果是函数,那么他会通过依赖注入被调用,并且负责通过`$get()`方法返回一个对象。 如果是数组,会被当成一个带有行内依赖注入声明的函数处理。数组的最后一个元素应该是函数,可以返回一个带有`$get()`方法的对象。 如果是对象,它应该带有`$get()`方法。
我们来看看factory()与provider()创建同一个服务时候的写法区别:
//factory方法angular.module("myapp").factory("myservice", function(){return {"username": "frank"};});//provider方法angular.module("myapp").provider("myservice", {$get : function(){return {"username": "frank"};}});
可以很显然看出来:factory()比provider()的写法更加简单,所以它更为常用。那么什么时候建议使用provider()呢?答案是:当需要用AngularJS的.config()函数来对.provider()方法返回的服务进行额外的拓展配置的时候。比如我们希望在应用启动前配置githubService的URL。
angular.module("myApp",[]).provider("githubServiceProvider",funciton(){var githubUrl = "https://github.com",setGithubUrl : function(url){if(url){ githubUrl = url};},$get : function($http){self = this;return $http({url : githubUrl + "/events"});}});
那么在.config()函数中,就可以使用
angular.module("myApp",[]).config(function(githubServiceProvider){githubServiceProvider.setGithubUrl("git@github.com");});
这里就介绍这么多,剩余三个service()、 constant()、 value()都比较简单,一些特殊应用场景而已。
