走进AngularJs(六) 服务

  今天学习了一下ng的service机制,作为ng的基本知识之一,有必要做一个了解,在此做个笔记记录一下。

一、认识服务(service)

  服务这个概念其实并不陌生,在其他语言中如java便有这样的概念,其作用就是对外提供某个特定的功能,如消息服务,文件压缩服务等,是一个独立的模块。ng的服务是这样定义的:

Angular services are singletons objects or functions that carry out specific tasks common to web apps.

  它是一个单例对象或函数,对外提供特定的功能。

  • 首先是一个单例,即无论这个服务被注入到任何地方,对象始终只有一个实例。
  • 其次这与我们自己定义一个function然后在其他地方调用不同,因为服务被定义在一个模块中,所以其使用范围是可以被我们管理的。ng的避免全局变量污染意识非常强。

  ng提供了很多内置的服务,可以到API中查看http://docs.angularjs.org/api/。知道了概念,我们来拉一个service出来溜溜,看看到底是个什么用法。(从这篇文章开始,我就使用jsfiddle来写示例代码了,再也不折腾博客园的变态编辑器了~)  

  我们在controller中直接声明$location服务,这依靠ng的依赖注入机制。$location提供地址栏相关的服务,我们在此只是简单的获取当前的地址。

  服务的使用是如此简单,我们可以把服务注入到controller、指令或者是其他服务中。

二、自定义服务

  如同指令一样,系统内置的服务以$开头,我们也可以自己定义一个服务。定义服务的方式有如下几种:

  • 使用系统内置的$provide服务
  • 使用Module的factory方法
  • 使用Module的service方法

  下面通过一个小例子来分别试验一下。我们定义一个名为remoteData服务,它可以从远程获取数据,这也是我们在程序中经常使用的功能。不过我这里没有远程服务器,就写死一点数据模拟一下。

//使用$provide来定义var app = angular.module(‘MyApp‘, [], function($provide) {
    $provide.factory(‘remoteData‘, function() {
        var data = {name:‘n‘,value:‘v‘};
        return data;
    });
});
//使用factory方法
app.factory(‘remoteData‘,function(){
    var data = {name:‘n‘,value:‘v‘};
    return data;
});
//使用service方法
app.service(‘remoteData‘,function(){
    this.name = ‘n‘;
    this.value = ‘v‘;
});

  Module的factory和$provide的factory方法是一模一样的,从官网文档看它们其实就是一回事。至于Module内部是如何调用的,我此处并不打算深究,我只要知道怎么用就好了。

  再看Module的service方法,它没有return任何东西,是因为service方法本身返回一个构造器,系统会自动使用new关键字来创建出一个对象。所以我们看到在构造器函数内可以使用this,这样调用该服务的地方便可以直接通过remoteData.name来访问数据了。

  下面我们来用一下自己定义好的服务:

三、管理服务的依赖关系

  服务与服务中间可以有依赖关系,例如我们这里定义一个名为validate的服务,它的作用是验证数据是否合法,它需要依赖我们从远程获取数据的服务remoteData。代码如下:

  在factory的参数中,我们可以直接传入服务remoteData,ng的依赖注入机制便帮我们做好了其他工作。不过一定要保证这个参数的名称与服务名称一致,ng是根据名称来识别的。若参数的名次与服务名称不一致,你就必须显示的声明一下,方式如下:

app.factory(‘validate‘,[‘remoteData‘,function(remoteDataService){
    return function(){
        if(remoteDataService.name==‘n‘){
            alert(‘验证通过‘);
        }
    };
}]);

  我们在controller中注入服务也是同样的道理,使用的名称需要与服务名称一致才可以正确注入。否则,你必须使用$inject来手动指定注入的服务。比如:

function testC(scope,rd){
    scope.getData = function(){
        alert(‘name:‘+rd.name+‘   value:‘+rd.value);
    }
}
testC.$inject = [‘$scope‘,‘remoteData‘];

-------------------补充于2014.01.11-------------------------

  感谢@Terry Sun指出,在controller中注入服务,也可以在定义controller时使用数组作为第二个参数,在此处把服务注入进去,这样在函数体中使用不一致的服务名称也是可以的,不过要确保注入的顺序是一致的,如:

app.controller(‘testC‘,[‘$scope‘,‘remoteData‘,function($scope,rd){
    $scope.getData = function(){
        alert(‘name:‘+rd.name+‘   value:‘+rd.value);
    }
}]);

  ng服务的基本知识也就这些了。目前只是学些皮毛,或许以后用到项目中了才能体会到他的强大之处,以及在真实使用中的这样那样的问题。

来源:http://www.cnblogs.com/lvdabao/p/3464015.html

来自为知笔记(Wiz)

时间: 2024-08-06 00:13:47

走进AngularJs(六) 服务的相关文章

转走进AngularJs(八) ng的路由机制

走进AngularJs(八) ng的路由机制 2013-12-19 我来说两句 收藏 我要投稿 今天心情不错~,公司请了个中医来给按摩拔罐刮痧,一套下来那个爽啊~,趁着精力充沛了解了下Angular的路由机制,在此分享出来与大家共同学习. 在谈路由机制前有必要先提一下现在比较流行的单页面应用,就是所谓的single page APP.为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而ajax的一个致命缺点就是导致浏览器后退按钮失效,尽管我们可以

AngularJS 自定义服务、指令

参考链接:http://www.111cn.net/wy/js-ajax/90977.htm AngularJS 注册服务 AngularJS的后台控制可以在Controller里面实现. 可是如果所有的逻辑代码都写到Controller会显得该Controller过于臃肿. 不方便维护, AngularJS提供了一个可以依赖注入的方法.我们可以将逻辑处理封装到Service中,需要调用只需要引入对应的Service即可. AngularJS 自定义指令(个人感觉像React的编程思想) 在前端

Angularjs 自定义服务 provide 里 provider 方法 以及 factory、 service 方法以及 provider 供应商的概念

Angularjs 自定义服务 provide 里 provider 方法 以及factory. service 方法以及 provider 供应商的概念 学习要点:1. Angularjs 中的 provider 方法2. Angularjs 中的 factory 方法3. Angularjs 中的 service 方法4. provider 供应商的概念5. 研究 ionic 代码中的 services 当你初试 Angular 时,很自然地就会往 controller 和 scope 里堆

Angularjs 常用服务 $http $location $anchorScroll $cacheFactory $timeout $interval $sce

Angularjs 常用服务 $http $location$anchorScroll $cacheFactory $timeout $interval $sce学习要点:1. Angularjs 中的 $http 服务2. Angularjs 中的 $location $anchorScroll 服务3. Angularjs 中的 $cacheFactory 服务4. Angularjs 中的 $timeout $interval 服务5. $sce 服务 浏览器简析 html 标签1. An

为什么很多人愿意走进外资去服务?

要是给你一个选择去外资或去民企?你会选哪个呢? 很多人都愿意去外资,这是无疑的,首先外资人性化这点是不可否认的,很多民营的企业上班期间,不准吸烟,不准这个,不准那个:虽然外资也有,但毕竟他们对这方面没有太多的约束,可以说是你想干嘛就干嘛.每天8小时制,多出的算加班,周末休息(通常都会加班半天或一天),这个事可以商量的.民企呢,一样8小时制,周六加班是必须的,没得休息,这让很多人有些不爽,爱加班的人很爽.在民企里几乎是你这块区域的活你都要会或是这方面的都交给你了,外资是各负责各的事,干好本分就ok

angularjs 获取服务端口数据的方法---$http,$resource,Restangular

angularjs 获取服务端口数据的方法(三种):  $http, $resource, Restangular.   另外BREEZE 也可以参考(ODATA) 其中:$http, 与 Restangular返回 promise.       promise 是一种以函数来作为then属性值的对象: then(fulfilledHandler, errorHandler, progressHandler) 添加fulfilledHandler.errorHandler和progressHan

走进AngularJs(一)angular基本概念的认识与实战

一.前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,作为一名业界新秀,紧跟时代潮流,学习掌握新知识自然是不敢怠慢.当听到AngularJs这个名字并知道是google在维护它时,便一直在关注,看到其在国外已经十分火热,可是国内的使用情况却有不小的差距,参考文献/网络文章也很匮乏.朝思暮想良久,决定深入学习angular,并写系列博客,一方面作为自己学习路程上的记录,另一方面也给有兴趣的同学一些参考. 首先我自己是一名学习者,会以学习者的角度来整理我的行文思路,故该系

走进AngularJs(二) ng模板中常用指令的使用方式

通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板开始入手是个不错方式,因为这部分内容相对简单好理解,而且是视图层的东西,大家都喜欢可以立马看得见的东西嘛.本篇我将搜罗模板中的常用指令一一测试,了解其使用方法,有点像背单词的感觉,会比较枯燥.不过对于初学,这样的枯燥是必须要经历的,开始~ 一.模板中可使用的东西及表达式 模板中可以使用的东西包括以下

走进AngularJs(七) 过滤器(filter) - 吕大豹

时间 2013-12-15 16:22:00  博客园-原创精华区 原文  http://www.cnblogs.com/lvdabao/p/3475426.html 主题 AngularJS 过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们是:currency(货币).date(日期).filter(子串匹配).json(格式化json对象).