服务是AngularJS中非常重要的一个概念,虽然我们有了控制器,但考虑到其生命实在脆弱,我们需要用到服务。

起初用service时,我便把servicefactory()理所当然地关联起来了。
确实,factory()是创建一个服务的最简单的方式,但服务并非仅此而已。

这里记录一下我对服务的一些简单认识。

Service

非常重要的一点 —— 服务是单例
一个服务在一个AngularJS应用中只会被$injector实例化一次,并贯穿应用的整个生命周期,与脆弱的控制器们进行通信。

先从注册一个服务开始,注册服务的最常见方式便是factory()
比如:

var myApp = angular.module('myApp',[])
.factory('myService',function() {
return {};
});

factory()以对象或者函数形式返回一个服务。
我们试试给myService注入$http服务,写一个像那么回事的东西。

(ps:找了一些URL都不是很理想,我也只好学别人的demo,从github获取用户的活动日志信息)

注入? 把服务注入给控制器也是这样,把服务的名字放到参数列表里就算是注入了,但这只是简单的方式。

好了,先把myService修改一下:

.factory('myService',function($http) {

    return {
getUserActivities: function(username){
return $http({
method: 'JSONP',
url:'https://api.github.com/users/'+username+'/events?callback=JSON_CALLBACK'
});
}
};
})

根据输入的用户名进行请求,输出活动信息,视图如下:

<div ng-controller="myController">
<input type="text" ng-model="username" />
<table border="1">
<tr>
<th></th>
<th>user</th>
<th>to</th>
<th>at</th>
</tr>
<tr ng-repeat="activity in activities">
<td><img src="{{activity.actor.avatar_url}}" width="25px" height="25px"/></td>
<td>{{ activity.actor.login }} </td>
<td>{{ activity.repo.name }}</td>
<td>{{activity.created_at}}</td>
</tr>
</table>
</div>

我们需要$watch这个变量,但需要注意的是,如果请求频率超过限制,github会给个403。
因此还需要用$timeout控制一下请求频率,一段时间之内重复请求就把之前的干掉。
控制器调用服务代码如下:

.controller('myController',function($scope,myService,$timeout,$log){

    var timeout;
$scope.$watch('username',function(){
if(timeout){
$timeout.cancel(timeout)
$log.info('timeout:::'+timeout);
} timeout= $timeout(function(){
myService.getUserActivities($scope.username)
.success(function(response, status, headers, config){
$scope.activities = response.data;
})
.error(function(response, status, headers, config){
$log.info(status)
})},1000);
});
})

factory()注册一个服务似乎不那么复杂。
事实上,我们有5种方式来创建服务:

  • factory
  • service
  • constant
  • value
  • provider

factory

最简单的方式,该函数接收2个参数

  • name (string):服务名
  • getFn (function/array):AngularJS实例化服务时调用该函数

service

可能是因为更加语义化的缘故,比起factory(),我更喜欢service()
service也同样接收2个参数,分别是:

  • name (string):服务名
  • constructor (function):服务对象的构造函数

试着改用service():

.service('myService',function($http) {
this.getUserActivities = function(username){
return $http({
method: 'JSONP',
url:'https://api.github.com/users/'+username+'/events?callback=JSON_CALLBACK'
});
}
})

constant与value

这两个名字感觉比较另类,它们的参数都是一样的:

  • name
  • value

仅从语义上来讲,如果服务的$get方法只是返回个常量,这两个方法确实适合。
可能会尝试写个函数进去,如果只是定义的话则不会报错。
但不会有相应的provider,调用时也会提示该服务不是一个函数之类的问题。

所以还是老老实实地这样使用:

.constant('serviceId','00001')

那两者的区别又是什么?
区别在于注入到config()时,以上面的serviceId为例。
如果serviceId是个constant,我们可以将serviceId注入到config()中,但是无法将serviceIdProvider注入到config()中,而value则刚好相反。

provider

provider()是最原始的方法。
我们试着用factory()provider()创建相同的服务进行对比。

.factory('aService',{
'name':'a'
})
.provider('bService',{
$get: {'name':'b'}
})

也就是说factory()的第二个参数相当于是$get?
provider()接收两个参数:

  • name (string) :仍然是服务实例的名字,如果name+'Provider'便是provider的名字。
  • provider (object/array/function) : 不是服务,是带$get()的provider

$provide服务在运行时初始化provider,$injector调用$get创建服务实例。
那为什么要用provider()而不是其他方式?
关键在于config(),如果我们给多个应用共享某个服务,但在注入服务之前给注入到不同应用的服务进行相应的设置,则需要在config()中通过服务的provider进行设置,比如加个decorator什么的。

decorator

就是装饰服务,添加功能或者完全改变服务。
decorator()接收两个参数

  • name (string):要装饰的服务的名称
  • decoratorFn (function):服务实例化时由$injector调用该函数。

下面是一个例子,在获得用户活动信息后输出耗时:

.config(function(myServiceProvider,$provide){
$provide.decorator('myService',function($delegate,$log) {
var activities = function(username) {
var startedAt = new Date();
var activities = $delegate.getUserActivities(username);
activities.finally(function() {
$log.info("Fetching activities" +" took " +(new Date() - startedAt) + "ms");
});
return activities;
};
return {getUserActivities:activities};
});
})

AngularJS - 服务简介的更多相关文章

  1. J2EE基础之Web服务简介

    J2EE基础之Web服务简介 1.什么是Web服务? 在人们的日常生活中,经常会查询网页上某城市的天气信息,这些信息都是动态的.实时的,它是专业的气象站提供的一种服务.例如,在网上购物时,通常采用网上 ...

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

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

  3. 聊一聊 AngularJS 服务

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

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

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

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

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

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

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

  7. Spring Cloud与微服务构建:微服务简介

    Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...

  8. NFS服务简介

    NFS服务简介 NFS是Network File System的缩写,即网络文件系统.NFS是由Sun开发并发展起来的一项用于在不同机器,不同操作系统之间通过网络互相分享各自的文件.NFS serve ...

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

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

随机推荐

  1. [转载] vim带你装逼带你飞(一)

    前言:逃离windows有很长时间了,特别是当今android盛行的时代,我们没有理由不选择ubuntu作为编译开发android之首选.其实操作系统只是我们使用的一个工具, windows也好lin ...

  2. 探索 OpenStack 之(14):OpenStack 中 RabbitMQ 的使用

    本文是 OpenStack 中的 RabbitMQ 使用研究 两部分中的第一部分,将介绍 RabbitMQ 的基本概念,即 RabbitMQ 是什么.第二部分将介绍其在 OpenStack 中的使用. ...

  3. [麦先生]初学Laravel框架与ThinkPHP的不同(1)

    作为一个PHP菜鸟初学Laravel框架 在学习过程中我发现了其与TP框架的不同点,由于时间问题和认识还不够完善我先写出其中几点,有错误的地方希望各位大牛斧正... 1.渲染模版方式的不同:在Lara ...

  4. openfire+asmack搭建的安卓即时通讯(六) 15.4.16

    啊啊啊啊啊啊啊啊,这东西越做越觉得是个深坑啊! 1.SharedPreferences.Editor的密码保存和自动登录: 首先还是从主界面开始,因为要提升一下用户体验自然要加入保存密码和自动登录的功 ...

  5. POJ 1269 Intersecting Lines --计算几何

    题意: 二维平面,给两条线段,判断形成的直线是否重合,或是相交于一点,或是不相交. 解法: 简单几何. 重合: 叉积为0,且一条线段的一个端点到另一条直线的距离为0 不相交: 不满足重合的情况下叉积为 ...

  6. POJ 1836 Alignment --LIS&LDS

    题意:n个士兵站成一排,求去掉最少的人数,使剩下的这排士兵的身高形成“峰形”分布,即求前面部分的LIS加上后面部分的LDS的最大值. 做法:分别求出LIS和LDS,枚举中点,求LIS+LDS的最大值. ...

  7. 利用jquery来进行表单的多向提交

    最近由于特别忙,每晚都是1到2点倒床便睡的那种,所以没有给自己要求写日记,等这阶段过完,还会重新开始. 今天来写一个前端的表单提交的方法. 有时往往以为在同一个表单中,不同的按钮,来表达的含义不同,需 ...

  8. JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html 一.Servlet映射匹配问题: 在第一篇文章中的 ...

  9. 仙人掌(cactus)

    仙人掌(cactus) Time Limit:1000ms Memory Limit:64MB 题目描述 LYK 在冲刺清华集训(THUSC) !于是它开始研究仙人掌,它想来和你一起分享它最近研究的 ...

  10. 第三方登录之qq登录(转载)

    iOS QQ第三方登实现   我们经常会见到应用登陆的时候会有QQ,微信,微博等的第三方登陆 如图: 下面我们主要讲一下qq的第三方登陆如何实现 首先,到官网注册: http://wiki.conne ...