在使用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. C语言之字符串处理函数

    C语言中字符串处理函数介绍 下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数).所有的C语言编译系统中一般都提供这些函数. 1.puts函数——输出字符串的函数 一般的形式为p ...

  2. 完美卸载oracle11g步骤

    完美卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->Oracle - OraHome ...

  3. 深入源码分析使用jQuery连续发起jsonp请求失败的原因

    jQuery的 jsonp 大家应该是十分熟悉了.曾遇到过这样的需求1.希望请求几个相似的内容添加到页面2.请求的内容一定时间内是固定不变的,希望做个缓存. 于是脑子一拍写下了类似这样的代码 for( ...

  4. Microsoft Dynamics CRM MVP

    MVP 一个响亮的名称, 不是 Kobe Bryant 不是 LeBron Raymone James 这是 Microsoft Dynamics CRM MVP 求证Link: http://mvp ...

  5. add host bat

    ::Author > mdt jindahao ::Data > @echo off title 添加记录到HOST--------Powerd by LoveQishi echo. ec ...

  6. -[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 解决方法

    -[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 解决方法: 错误:NSMutableD ...

  7. sqlite之WAL模式

    链接 概述 在3.7.0以后,WAL(Write-Ahead Log)模式可以使用,是另一种实现事务原子性的方法. WAL的优点 在大多数情况下更快 并行性更高.因为读操作和写操作可以并行. 文件IO ...

  8. KVO的底层实现

    1.KVO是基于Runtime机制实现的: 2.当某个类的对象的某个属性第一次被观察时,系统会在运行期间动态地创建该类的一个派生类,在这个派生类中重写基类的任何被观察属性的setter方法,派生类在被 ...

  9. 你真的了解UIResponder吗?

    1:首先查看一下关于UIResponder的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIResponder : NSObject //响应链中负责传递事件的 ...

  10. php示例代码之读取文件

    php读取文件 1 2 3 4 5 6 7 8 $sourceString=''; $fp = @fopen($filename, "r");     while($line =  ...