AngularJS服务

在拔取AngularJS的路由管理和操纵视图加载的时候,当新的视图加载进来,原有视图的控制器会被销毁,那是出于内存占用和总体性的设想。服务提供了一种能在选取的满贯生命周期内保持和共享数据的措施,它可以在控制器之间展开通信,并且保持数据的一致性。

劳务是一个单例对象,在种种应用中只会被实例化一遍,并且是延迟加载的,服务提供了把与一定功用相关联的艺术集中在一块的接口。就拿常用的$http服务为例,它提供了对浏览器的XMLHttpRequest对象的最底层访问功用,我们得以因此$http的API与XMLHttpRequest举行交互,而不必要因为调用那几个底层代码而污染应用。

angular.module(“myApp”, [])

.factory(“userService”, function($http) {

var current_user;

return {

getCurrentUser: function() {

return current_user;

},

setCurrentUser: function(user) {

current_user = user;

}

};

}); //示例服务,在动用的全套生命周期内保存current_user

为友好的利用创造服务是很是不难的,只须要注册那些服务就可以。服务被登记后,AngularJS编译器就足以引用它,并且在运行时把它看作依赖加载进来。服务名称的注册表使得在测试中伪造和剔除彼此隔离的使用变得分外容易。

注册一个劳务

用$injector来创制和注册服务有一些种方法

采取angular.module的factory API创造服务,是最广泛也是最灵敏的措施:

angular.module(“myApp.services”, [])

.factory(“serviceName”, function() {

var serviceInstance = {};

return serviceInstance; });

此刻,serviceName已经注册成为那一个AngularJS应用的一个服务了。

劳务的厂子函数用来生成一个单例的对象或函数,那些目标或函数就是劳务,它会存在于运用的总体生命周期内。同创制控制器的艺术同样,服务的厂子函数既可以是一个函数也足以是一个数组:

angular.module(“myApp.service”, [])

.factory(“serviceName”, [function($http) {} ]);

运用服务

可以在控制器、指令、过滤器或此外一个服务中通过器重申明的艺术来采纳劳务。AngularJS会像平日一律在运行期自动处理实例化和依赖性加载的相关事宜。将服务的名字当作参数传递给控制器函数,可以将劳动注入到控制器中。当服务变成某个控制器的借助,就可以在控制器中调用任何概念在那几个服务对象上的主意。

myApp.controller(“ServiceController”, function($scope, $timeout,
serviceName) {} );

像上面那样在自定义服务在此之前注入所有的AngularJS内置服务,那是约定俗成的规则。

为了在控制器之间共享数据,要求在劳务中添加一个用来储存用户名的法门。记住,服务在采用的生命周期内是单例形式的,由此可以将用户名安全的贮存在中间。

AngularJS应用中,factory()方法是用来注册服务的最健康格局,别的还有局地API能够在特种的情况下扶助我们减弱代码量。

factory()

service()

constant()

value()

provider()

若是希望在config()函数中可以对劳务举办配置,必须用provider()来定义服务。

tips:
单例情势是一种常用的软件设计形式,在它的主导结构中只包罗一个叫作单例类的新鲜类。通过单例情势可以保险系统中一个类唯有一个实例而且该实例易于外界访问,从而有利于对实例个数的主宰并节约系统资源。要是期待在系统中某个类的对象只好存在一个,单例情势是最好的化解方案。

本文内容出自《AngularJS权威教程》一书。

相关文章