模型是指$scope上保存的包含瞬时状态数据的JavaScript对象。

服务是一个单例对象,只会被$injector实例化一次,并且是在需要的时候才会被创建,服务提供了把与特定功能相关联的方法集中在一起的接口。

共有5种方式来创建服务:

    • factory(name,getFn):

      • name为注册的服务名,服务是单例对象在应用的生命周期内只会被调用一次,getFn可以是一个函数或者是一个包含可被注入对象的数组。
    • service(name,constructor):
      • name为要注册的服务名,constructor为构造函数,用来生成服务对象,在创建实例的时候通过new关键字来实例化服务对象(也就是创建一个对象,然后将构造函数的this绑定到这个对象上)。
    • provider(name,aProvider):
      • name参数为provideCache中注册的名字,也是服务实例的名字,name+Provider会成为服务的提供者。aProvider参数要求为一个提供者对象(包含$get函数)。所有的服务工厂都是由$provide提供的,$provide服务负责在运行时初始化这些提供者,提供者是一个具有$get()方法的对象。该方法负责在$providerCache中注册服务,所有创建服务的方法都是构建在provider方法之上,factory()方法是provider()方法的简略形式,将如传入的函数默认为服务提供者的$get函数,注入器注入服务的其实是服务提供者的$get返回的对象,也就是说$injector通过调用$get方法来创建服务实例。此外,AngularJS的config函数,可以对provider()方法返回的服务可以进行额外的配置,在config对其提供者(ServiceProvider)进行配置。
    • constant(name,value):
      • 可以将已经存在的常量注册为服务。
    • value(name,value):
      • 与constant类似,只不过前者可以注入到配置函数中来配置数据,而value不行。
    • decorator(name,decoratorFn):
      • $provide服务提供了在服务实例创建时对其进行拦截的功能,可以对服务进行扩展或者完全用另外的内容来替代name为要拦截的服务,decoratorFn为装饰器函数,在服务实例化的时候进行调用。在装饰器函数中,$delegate是进行装饰的最原始的服务(就是要被装饰的服务的引用)。

测试代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="angular-1.5.8/angular.min.js"></script>
<script src="angular-1.5.8/angular-route.min.js"></script>
</head>
<body ng-app="MyApp">
<div ng-controller="MyController"></div>
<script>
var Person=function () {
this.name='baishoujing'
}
var app=angular.module('MyApp',['ngRoute']);
app.factory('UserService',['$log',function ($log) {
$log.info('UserService is loaded!')
return { name:'zhaoxiangjun '}
}]);
app.service('PersonService',Person)
app.controller('MyController',function (UserService,PersonService) {
alert(UserService.name)
alert(PersonService.name)
});
var UserServiceDecorator=function ($delegate,$log,$injector) {
$log.info($delegate)
alert($delegate)
return $delegate
};
app.config(function($provide){
$provide.decorator('UserService',UserServiceDecorator)
});
</script>
</body>
</html>

 运行结果:

AngularJs 学习笔记(四)服务的更多相关文章

  1. AngularJS学习笔记(四) 自定义指令

    指令(directive)是啥?简单来说就是实现一定功能的XXX...之前一直用的ng-model,ng-click等等都是指令.当我有一个ng没提供的需求的时候,就可以自定义个指令.指令的好处显而易 ...

  2. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  3. AngularJs学习笔记--Forms

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/forms 控件(input.select.textarea)是用户输入数据的一种方式.Form(表单) ...

  4. AngularJs学习笔记--expression

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/expression 表达式(Expressions)是类Javascript的代码片段,通常放置在绑定 ...

  5. AngularJs学习笔记--directive

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/directive Directive是教HTML玩一些新把戏的途径.在DOM编译期间,directiv ...

  6. AngularJs学习笔记--html compiler

    原文再续,书接上回...依旧参考http://code.angularjs.org/1.0.2/docs/guide/compiler 一.总括 Angular的HTML compiler允许开发者自 ...

  7. AngularJs学习笔记--concepts(概念)

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/concepts 继续.. 一.总括 本文主要是angular组件(components)的概览,并说明 ...

  8. AngularJs学习笔记--Using $location

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/dev_guide.services.$location 一.What does it do? $loc ...

  9. AngularJs学习笔记--Creating Services

    原版地址:http://docs.angularjs.org/guide/dev_guide.services.creating_services 虽然angular提供许多有用的service,在一 ...

  10. AngularJs学习笔记--Understanding the Controller Component

    原版地址:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model 在angular中,controller是一个javasc ...

随机推荐

  1. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

  2. OJ题:将一个数倒置输出

    题目描述: 输入一个数,假如num = 12345 , 输出 54321,以此类推. 代码实现: ) ; }

  3. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  4. shell的case语句简述(shell的流控制)

    shell流控制:http://www.cnblogs.com/yunjiaofeifei/archive/2012/06/12/2546208.html 1.if then else 语句 if t ...

  5. Python+Visual Studio

    一直在找一个比较好的Python IDE,无奈找来找去都不太好用,由于经常用Visual Studio,所以很希望找到一个能够在VS中的Python扩展.今天发现了一个很给力的VS扩展,可以在VS中方 ...

  6. ubuntu 开发环境配置及安装 nodejs

    ubuntu 开发环境配置及安装 nodejs 1 安装nodejs $ sudo apt-get install build-essential $ sudo apt-get install gcc ...

  7. XBMC源代码分析 7:视频播放器(dvdplayer)-输入流(以libRTMP为例)

    前文分析了XBMC的基本结构: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分 ...

  8. [WinForm]最小化到系统托盘,右键退出

    1.拉出一个notifyIcon1到用户界面,也可以NEW一个 2.拉出一个ContextMenuStrip控件,命名为mymenu,集合中增加退出 3.notifyIcon1的属性ContextMe ...

  9. 将Ext JS 5应用程序导入Web项目以及实现本地化

    在Ext JS 5,使用了新的脚本和样式加载方式,这对于将应用程序导入到Web项目中产生了点小麻烦.而对于本地化文件的导入,也采用了新的方式,本文将一一解答这些问题. 将Ext JS 5应用程序导入W ...

  10. (四十一)数据持久化的NSCoding实现 -实现普通对象的存取

    NSCoding可以用与存取一般的类对象,需要类成为NSCoding的代理,并且实现编码和解码方法. 假设类Person有name和age两个属性,应该这样设置类: .h文件: #import < ...