如果我没记错的话,spring里边有个service层。什么是服务呢?个人理解就是很多地方要用的,可以跨越控制器甚至是跨越模块的工具。AngularJS也为我们提供了服务这种机制,这让我们可以将一些不属于某个控制器独有的东西定义成一个服务,要用的时候直接拿过来就好。使用服务有什么好处呢?一是便于统一修改,二是调用者不用关心内部实现,三是便于测试。

一、factory

  

<!DOCTYPE html>
<html lang="en" ng-app='myApp'>
<head>
<meta charset="UTF-8">
<title>factory</title>
</head>
<body>
<div ng-controller="dayCtrl"></div>
<div ng-controller="secondCtrl"></div> <script type="text/javascript" src="../node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module("myApp",[]);
myApp.controller('dayCtrl',function($scope,logService){
logService.log("dayCtrl exec"); })
.factory('logService',function(){
var messageCount = 0;
return {
log: function(msg){
console.log("LOG"+messageCount++ +":"+msg);
}
}
})
.controller("secondCtrl",function(logService){
logService.log("secondCtrl exec");
})
</script>
</body>
</html>

  本例中我们用factory方法创建了一个服务,factory方法接受俩个参数,第一个表示服务名字,第二个是一个工厂函数,该函数返回一个对象,在对象中可以暴露服务 的方法。注意服务是单例的,正是因为如此,我们上面的服务才能够正确计数。调用自定义服务的方法和调用内置服务的方法是相同的,也是使用依赖注入。

二、service

  service的使用方法和factory方法有所区别,他的第二个参数是一个构造器(或者叫构造函数)。

  

<!DOCTYPE html>
<html lang="en" ng-app='myApp'>
<head>
<meta charset="UTF-8">
<title>service</title>
</head>
<body>
<div ng-controller="dayCtrl"></div>
<div ng-controller="secondCtrl"></div> <script type="text/javascript" src="../node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module("myApp",[]);
function BaseLogger(){
this.messageCount = 0;
this.log = function(msg){
console.log(this.messageType+":"+this.messageCount++ +":"+msg);
}
} function DebugLogger(){};
DebugLogger.prototype = new BaseLogger();
DebugLogger.prototype.messageType="Debug"; function ErrorLogger(){};
ErrorLogger.prototype = new BaseLogger();
ErrorLogger.prototype.messageType = "Error"; myApp.controller('dayCtrl',function($scope,logService){
logService.log("dayCtrl exec"); })
.service("logService",DebugLogger)
.service("errorService",ErrorLogger)
.controller("secondCtrl",function(errorService){
errorService.log("secondCtrl exec");
})
</script>
</body>
</html>

   其实,service也可以当作facrory用

  

<!DOCTYPE html>
<html lang="en" ng-app='myApp'>
<head>
<meta charset="UTF-8">
<title>factory</title>
</head>
<body>
<div ng-controller="dayCtrl"></div>
<div ng-controller="secondCtrl"></div> <script type="text/javascript" src="../node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module("myApp",[]);
myApp.controller('dayCtrl',function($scope,logService){
logService.log("dayCtrl exec"); })
.service('logService',function(){
var messageCount = 0;
return {
log: function(msg){
console.log("LOG"+messageCount++ +":"+msg);
}
}
})
.controller("secondCtrl",function(logService){
logService.log("secondCtrl exec");
})
</script>
</body>
</html>

  这样做是没有问题的。

三、provider

  provider方法可以让你更好地控制被创建或被配置的服务对象的方式。

  

<!DOCTYPE html>
<html lang="en" ng-app='myApp'>
<head>
<meta charset="UTF-8">
<title>provider</title>
</head>
<body>
<div ng-controller="dayCtrl"></div> <script type="text/javascript" src="../node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module("myApp",[]);
myApp
.config(function(logServiceProvider){
logServiceProvider.debugEnabled(false);
})
.controller('dayCtrl',function($scope,logService){
logService.log("dayCtrl exec"); })
.provider('logService',function(){
var debug = true;
return {
debugEnabled:function(setting){
if(angular.isDefined(setting)){
debug = setting;
return this;
}else{
return debug;
}
}, $get:function(){
return {
messageCount:0,
log:function(msg){
if(debug){
console.log("LOG"+this.messageCount++ +":"+msg);
} }
}
}
} })
</script>
</body>
</html>

  provider非常强大,可以通过config对我们的服务进行配置。上例中提供了debugEnabled方法,可以对是否记录日志进行配置。实质上,看看源码就会知道就可以知道service和factory方法都是provider方法的特殊形式。

  看到没,factory是调用的provider,service是调用的factory,所以说service和factory都是provider,他们可以做的provider也可以做。

四、内置服务

  这里引用一下(请参考:http://www.cnblogs.com/best/p/6263915.html

  $http 发送http请求

  $resource 创建一个可以RESTful服务器端数据源交互对象

  $window 浏览器的window元素的jQuery包装

  $document 浏览器的document元素的jQuery包装

  $rootScope 根作用域的访问

  $rootElement 根元素的访问

  $cacheFactory 提供键/值对放置到对象缓存

  $interval 提供对window.setInterval访问

  $timeout 提供对window.setTimeout访问

  $cookies 提供对浏览器的cookie的读写访问

  $animate 提供动画钩子来同时链接到以CSS和JavaScript为基础的动画

  好了,关于服务就先到这了,今天必须把ajax和路由看完。加油加油!    

AngularJS1.X学习笔记11-服务的更多相关文章

  1. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  2. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  3. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  4. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  5. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  6. 并发编程学习笔记(11)----FutureTask的使用及实现

    1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...

  7. 《C++ Primer Plus》学习笔记11

    <C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...

  8. SpringCloud学习笔记:服务支撑组件

    SpringCloud学习笔记:服务支撑组件 服务支撑组件 在微服务的演进过程中,为了最大化利用微服务的优势,保障系统的高可用性,需要通过一些服务支撑组件来协助服务间有效的协作.各个服务支撑组件的原理 ...

  9. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  10. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

随机推荐

  1. Java过滤XSS脚本, 可通过Appscan扫描

    项目中有时会需要把一些报错或者解决方案直接返回给前端, 如果直接返回原字符串, 可能会被恶意传参来实现xss注入. 例如常规业务访问一个页面读取文件&file=sdf.cpt, 如果文件不存在 ...

  2. java基本语法特殊点

    一.关系运算符 instanceof(类型比较运算符) example:a instanceof hello // hello是一个class ==与!=可以用于引用相等运算符( 二.数组 (数组是对 ...

  3. 进入TP-Link路由器之后利用快捷键F12查看星号路由密码的方法

    今天又破解了几个路由器,这两张图片是大多数路由器如TP-LINK路由器查看拨号圆点密码的方法.

  4. fastjson从1.1.41升级到1.2.28的坑

    最近因为fastjson安全漏洞,升级jar包时,踩了一些坑. 新版本FastJsonHttpMessageConverter初始化,默认设置MediaType为*/* 背景: 使用Spring Re ...

  5. Unix 让进程安全地退出

    终止一个进程有很多方法(暂只说linux环境):前台运行的进程,如果没有提供退出功能,我们通常会Ctrl+C进行终止:后台或守护进程,如果也没有提供退出命令啥的,咱通常会kill掉:此外还有类似关机或 ...

  6. 记kkpager分页控件的使用

    kkpager支持异步加载分页: 1.页面添加div标签和引用JS,默认标签为<div id="kkpager"></div> 引用JS和样式 <sc ...

  7. Mybatis转义字符

    Mybatis的sql语句中需要用到'>'或者'<'时,不能直接使用. < < 小于号 > > 大于号 & & 和 &apos; ' 单引号 ...

  8. 配置COCO API(安装COCO)

    仍旧是win10,Python3.5 从GitHub下载coco源码,解压到任意文件夹.(或者创建一个工程)coco源码链接 https://github.com/cocodataset/cocoap ...

  9. robotframework环境搭建问题

    启动的时候报错,应该是环境变量没有配置好 错误: command: pybot.bat --argumentfile c:\users\keikei\appdata\local\temp\RIDEam ...

  10. java设计模式-State(状态)模式

    state定义     不同的状态,不同的行为;或者说,每个状态有着相应的行为.         就像电风扇的开关,一档的上一个是关闭,关闭的上一个是五档,五档的上一个是四档,以此类推,而且五档的下一 ...