在使用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权威教程》一书。

AngularJS服务的更多相关文章

  1. 前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite

    一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象, ...

  2. 聊一聊 AngularJS 服务

    什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 多个服务. 为什么使用服务? 在很多服务中,比如 $loca ...

  3. 前端MVC学习笔记(三)——AngularJS服务、路由、内置API、jQueryLite

    一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象, ...

  4. AngularJS学习之旅—AngularJS 服务(八)

    1.AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务.2.什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 Angular ...

  5. AngularJS 1.x系列:AngularJS服务-Service、Factory、Provider、Value及Constant(5)

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  6. AngularJS 1.x系列:AngularJS服务-Service

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  7. 18.angularJS服务

    转自:https://www.cnblogs.com/best/tag/Angular/ 服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可 ...

  8. Angularjs 服务注册

    $injector: (When you request a service, the $injector is responsible for finding the correct service ...

  9. AngularJS 服务(Service)

    AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 ...

随机推荐

  1. 学习hadoop遇到的问题

    1.运行hadoop的帐号,需要多大的权限? 之前实验用的帐号是root,后来新建了个普通帐号,发觉不能直接套用到已经建立好的hadoop系统,因为无权限,即使将普通帐号加入到root群组仍然存在异常 ...

  2. html和css的编码规范

    HTML和CSS编码规范内容 一.HTML规范 二.CSS规范 三.注意事项: 四.常用的命名规则 五.CSS样式表文件命名 六.文件命名规则 一.HTML规范: 1.代码规范 页面的第一行添加标准模 ...

  3. 分享一组很赞的 jQuery 特效【附源码下载】

    作为最优秀的 JavaScript 库之一,jQuery 不仅使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入漂亮的效果.这篇文章挑选了8个优秀的 jQuery 实例教程,这些  ...

  4. 为什么URL中的中文需要Encode两次?

    在URL中传参的时候常常需要传入中文,这个时候就需要对中文参数进行编码,即URLEncode.但是,常常是Encode两次,而不是一次,为什么呢? 首先要知道,tomcat会自动解码一次: 这样的话, ...

  5. CRM 2015 快速抓取表单上字段

    var table='<table><tr><td>序号</td><td>字段名</td><td>Schema名称& ...

  6. Base64 Converter

    <Window x:Class="Base64Convertor.MainWindow" xmlns="http://schemas.microsoft.com/w ...

  7. 【代码笔记】iOS-时间选择框

    一, 效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewControlle ...

  8. JSON字符串与JSON对象

    JSON对象是直接可以使用JQuery操作的格式,和js中的对象一样,可以用对象(类名)点出属性(方法). JSON字符串仅仅只是一个字符串,一个整体,不截取的话没办法取出其中存储的数据,不能直接使用 ...

  9. Java基础知识学习(八)

    IO操作 5个重要的类分别是:InputStream.OutStream.Reader.Writer和File类 面向字符的输入输出流 输入流都是Reader的子类, CharArrayReader ...

  10. jQuery添加options点击事件并传值

    说明: 根据选择不同店铺选项,上送不同id值,展示不同商品列表   var formStr = "{'supplierId':'供应链企业|%-jm-sprt-%|93794498-3'}& ...