(转)走进AngularJs(六) 服务

原文地址:http://www.cnblogs.com/lvdabao/p/3464015.html

 

  今天学习了一下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'];

 

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

转载于:https://www.cnblogs.com/fcsh820/p/3464323.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动程序框架以及概述

目录驱动程序三种基本类型(组成)设备驱动程序功能驱动程序的内核模块机制(开发模式)驱动程序框架三个主要部分1、字符设备驱动程序框架2、块设备驱动程序框架2、网络设备驱动程序框架驱动程序三种基本类型(组成&#x…

curl 使用整理(转载)

我一向以为,curl只是一个编程用的函数库。 最近才发现,这个命令本身,就是一个无比有用的网站开发工具,请看我整理的它的用法。 curl网站开发指南 阮一峰 整理 curl是一种命令行工具,作用是发出网络请求,然…

Linux内核逻辑结构

linux内核从逻辑上可以分为5个部分: 1、进程调度 进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的程序。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其他资源,则该进程是不可…

对批量文件重命名

一、 文件夹下存放各种不同名称的同类型文件 F:\test 二、重命名格式从a0开始,数字依次递增,a0,a1,a2,a3… import ospathr"F:\test"#要修改文件的路径 namer"a"#命名从什么开始 num0#默认从0开始,即a0,a1,a2...... …

替换Quartus 自带编辑器 (转COM张)

正文 此处以Quartus II 11.1和Notepad v5.9.6.2为例。 1. 使用QII自动调用Notepad来打开HDL、sdc、txt等文件;并且可以在报错的时候,Notepad可以直接高亮所报错的行(此模式下,Notepad最大化后效果最佳)。 方法&#xf…

scala 方法重载_Scala中的方法重载

scala 方法重载Scala方法重载 (Scala method overloading) Method overloading is a method that is redefined in different ways under the same name. Method overloading is one of the methods used to implement polymorphism in Scala. 方法重载是一种使用相同名称以不…

C#网页自动登录和提交POST信息的多种方法 新人学习中

网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以用来提取网页HTML的组件比较多,常用的用WebBrowser、WebClient、HttpWebRequest这三个。 以下就分别用这三种方法来实现:1、WebBr…

四、采集和制作数据集

一、采集数据 安装labelme:pip install labelme 打开labelme:labelme 将收集好的照片(320320,png格式)存放到一个文件夹中,例如我的是F:\test,再此文件夹下再创建个文件夹label用于存放标签文件 使用labelme打开数据…

MTFBWU的完整形式是什么?

MTFBWU:愿力量与您同在 (MTFBWU: May The Force Be With You) MTFBWU is an abbreviation of “May The Force Be With You". MTFBWU是“愿力量与你同在”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media n…

VMware14.0 安装 CentOS7.2

大致流程 对于VMware14.0安装包用百度网盘下载即可。 链接:https://pan.baidu.com/s/1DEGa47EbI1Fup_MTXhv0xg 提取码:izo6 华为云CentOS7 下载划线的。其他步骤与大致流程里一样。 最后输入root 以及配置的密码即可:密码输入时是没有任何显…

基于visual Studio2013解决C语言竞赛题之1049抓牌排序

题目解决代码及点评/* 功能:插入排序。许多玩牌的人是以这样的方式来对他们手中的牌进行排序的:设手中原有3张牌已排好序,抓1张新牌,若这张新牌的次序在…

学习Lucene笔记一:创建索引

public class HelloLucene {/*** 建立索引* param args*/public void index(){IndexWriter writer null; try {//1.创建Directory,// Directory directory new RAMDirectory();//索引是建立在内存中的Directory directory FSDirectory.open(new File("D:/Lucene/ind…

【C++进阶】C++创建文件/屏幕输出流类(将信息同时输出到文件和屏幕)

在软件的调试技术中,很重要的一个技术是将软件运行过程中的一些信息写入到“日志文件”中。但是同时还要将信息显示到屏幕上,以方便程序员实时查看这些信息。 最简单的一种办法是这样的: std::ofstream output("debug.log", ios::…

五、加载数据集

之前写过加载数据集的一些小笔记,这里详细内容就不再叙述了 详细学习可以参考该博文二、PyTorch加载数据 一、分析 因为U-net网络架构是输入1通道,大小为(572,572)的灰度图,图片大小无所谓,我的思路是将三通道的图像使用OpenCV进…

CDMA的完整形式是什么?

CDMA:码分多址 (CDMA: Code Division Multiple Access) CDMA is an abbreviation of Code Division Multiple Access. Code Division Multiple Access is a digital cellular technology and displays a network of multiple accesses. The various radio communica…

BCD码与十进制的相互转换

BCD码是用每四位代替一位十进制数(0 到 9 的某一位数) 例如:0x25 就代表25 十六进制的每位转换成二进制代表四个位。 下面是bcd转char short int long c语言程序 //************************************************************…

DSP关于存储器读写、IO读写时序图的注意点

这里的存储器图不涉及插入等待周期。 IO设备的图可以自行减去插入等待周期,然后观察。 存储器读读写 存储器写写读 I/O设备读写操作

折腾430 launchpad

launchpad到手也已经很长时间了,团购了一个g2的,一个铁电的,现在马上又要来一个g2的,感觉手上的东西太多了,急需消化一下,首先呢还是先把430搞定吧。 ---------------------------------------------------…

oem模式是什么_OEM的完整形式是什么?

oem模式是什么OEM:原始设备制造商 (OEM: Original Equipment Manufacturer) OEM is an abbreviation of "Original Equipment Manufacturer". Its meaning has changed over time. In former times, it alluded to a corporation that manufactures produ…

妈了个巴卡

配置文件修改: 一、打开PC端微信,打开咩了个咩小程序,点进入第一关,之后再关掉小程序 二、PC端微信设置里面,找到管理文件,打开文件夹 三、Applet下按修改日期找到a9结尾的文件 四、接着进入\usr\gamecac…