今天学习了一下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服务的基本知识也就这些了。目前只是学些皮毛,或许以后用到项目中了才能体会到他的强大之处,以及在真实使用中的这样那样的问题。
分享到:
相关推荐
在AngularJS中,与Web服务器交互主要依赖于其内置的`$http`服务。`$http`服务提供了与HTTP协议兼容的方法,如GET、POST、PUT、DELETE等,用于向服务器发送请求并接收响应。它使用Promise API来处理异步操作,使得...
首先,《AngularJS_权威教程》可能涵盖了AngularJS的基础概念和核心特性,包括双向数据绑定、依赖注入、指令系统、服务、过滤器等。双向数据绑定是AngularJS的核心特性之一,它使得模型和视图之间的数据同步变得极其...
AngularJS的核心特性包括双向数据绑定、依赖注入、指令系统、过滤器和服务等。例如,双向数据绑定使得视图与模型之间的数据同步变得极其简单,而依赖注入则允许开发者轻松管理组件间的依赖关系,提高代码的可测试性...
服务是AngularJS中的单例对象,它们负责执行特定任务,如$http用于与服务器通信,$location用于处理URL,$q用于异步编程等。 **7. Routing:** AngularJS的路由功能使得在单页面应用中导航变得简单,通过uirouter或...
文件中的章节可能包括AngularJS的安装与设置、基础语法、指令详解、服务的使用、数据绑定的深入理解、模块和路由的配置,以及高级主题如单元测试和性能优化等内容。通过阅读和实践,你将能够掌握这个强大的前端框架...
在"angularJs demo 各种基本用法"中,我们可以深入探讨以下几个关键概念:路由(router)、过滤器(filter)、服务(service)以及指令(diractive)。 **路由(Router)**: AngularJS的路由功能允许我们根据URL来...
2. 模块(Module):模块是AngularJS应用的基础,它用来组织应用的组件,如控制器、服务、指令等。 3. 控制器(Controller):控制器是MVC模式中的C部分,负责处理业务逻辑和视图之间的交互。 4. 路由(Routing):...
4. **服务**:AngularJS 的服务是一种可注入的对象,可以用来封装和共享代码,如 $http 服务用于与服务器通信,$rootScope 服务则是应用范围内的全局作用域。 5. **依赖注入**:AngularJS 的依赖注入机制简化了组件...
AngularJS服务可以理解为在应用的全局范围内共享方法和变量的容器,它们是可注入的,这意味着你可以在需要的地方,如控制器(Controllers)、指令(Directives)、过滤器(Filters)等中,注入服务并使用它们所提供...
通过在控制器或其他服务中声明依赖,AngularJS会自动注入所需的服务实例,降低了代码间的耦合度,提高了可测试性。 **4. 指令** AngularJS的指令扩展了HTML,使其能够表达更多的业务逻辑。例如,`ngRepeat`用于...
AngularJS的核心特性包括双Way数据绑定、指令系统、服务、过滤器和路由等。这些特性使得开发者能够更加专注于业务逻辑,而不是关注DOM操作和状态管理。 Eclipse AngularJS插件的主要功能包括: 1. **代码自动完成*...
学习AngularJS不仅需要理解上述概念,还需要实践编写控制器、服务、指令、模板等,通过`AngularJs第二版.pptx`中的教程和示例,你可以更深入地了解并掌握这个强大的框架。同时,结合实际项目练习,将有助于你更好地...
7. **服务**:AngularJS 1.5.8提供了多种内置服务,如$http用于处理HTTP请求,$q用于异步编程,$rootScope是所有控制器共享的根作用域等。这些服务极大地丰富了框架的功能。 8. **过滤器**:过滤器用于格式化和转换...
- **第2章**:本章重点介绍AngularJS的核心概念,包括控制器、作用域和服务等。通过对这些基本概念的理解,读者可以更好地掌握AngularJS的应用逻辑和架构设计。 ### AngularJS的关键技术要点 #### 六、双向数据...
从数据绑定到模块化,再到服务和路由,AngularJS的每一部分都旨在简化开发流程,提高开发效率。尽管AngularJS已被更新的Angular版本所取代,但在许多现有的项目中,AngularJS仍然扮演着重要角色。
4. 服务:AngularJS的服务是可注入的对象,用于封装和复用业务逻辑或与服务器通信。1.5.8版本提供了一系列内置服务,如$http服务用于HTTP请求,$q服务用于处理异步操作,$rootScope服务作为所有控制器的父作用域。 ...
版 次:1页 数:348字 数:448000印刷时间:2014-10-1开 本:16开纸 张:胶版纸印 次:1包 ...第10章 创建为全球用户服务的AngularJS应用 第11章 开发健壮的AngularJS应用 第12章 打包和部署AngularJS Web应用 索引
结合AngularJS和Node.js,可能是一个完整的Web应用系统,包含前端界面(AngularJS实现)和后端服务(Node.js实现)。为了深入了解ttms,需要查看压缩包内的具体文件内容,包括HTML、CSS、JavaScript(AngularJS代码...
- **服务(Services)**:AngularJS中的服务是用来封装特定功能的对象,可以被多个模块共享。 - **控制器(Controllers)**:控制器是负责处理应用程序逻辑的部分,通常用来处理来自视图的输入,并将结果返回给视图...
├最新AngularJS开发宝典—第070讲 spa项目的server层分析与使用factory创建服务.mp4 ├最新AngularJS开发宝典—第071讲 多个控制器共享服务server数据的处理实例.mp4 ├最新AngularJS开发宝典—第072讲 使用service...