理解Angular 服务

什么是Angular Service

Angular 服务是为web应用执行特定任务的单例对象或方法。
注:如果组件是为了内容呈现的功能复用,那么服务就是为组件进行功能复用。

Angular有一些内建的服务(例如:$http),也可以创建自己的服务。内建的服务通常使用“$”开头(与jQuery类似)。

使用Angular 服务

在使用Angular服务的时候,只要将其注册成为Angular组件的一个依赖项目就可以了。Angular会自动对这个服务进行实例化、信赖处理等。

Angular使用“constructor”(构造器)进行信赖注入。信赖将会传递给组件的工厂或构造器方法。因为JavaScript是一个动态类型的语言,Angular的信赖注入子系统不能使用静态的类型来识别服务的信赖。因此,一个组件必须明确的通过使用一种“注释”注入方法来定义它的信赖。例如,使用$inject属性:

var MyController = function($location) { ... };
MyController.$inject = ['$location'];
myModule.controller('MyController', MyController);

或者提供一个内联的注入“注释”:

var myService = function($http) { ... };
myModule.factory('myService', ['$http', myService]);

参考:

定义一个服务

应用开发人员通过在Angular模块中注册“名字”与“服务工厂”来定义自己的服务。

服务的工厂方法的目的是用来生成单例对象(或者方法function)。生成的对象或者方法可以通过指定到这个服务的信赖来被注入到任意的组件当中。

Angular工厂方法使用消极执行策略,这意味着,只有当需要处理一个依赖的时候,才会为每一个服务执行一次。所有的事项都是依赖于这个服务来获取一个被服务工厂方法生成的实例。

管理服务信赖

Angular允许服务声明其他的服务作为信赖需要,用来构造它们的实例。

为了声明依赖,你可以在工厂方法的参数中指定它们,然后通过使用$inject属性、字符串数组或数组注释以注入注释标明这个方法。

使用数组注释:

function myModuleCfgFn($provide) {
$provide.factory('myService', ['dep1', 'dep2', function(dep1, dep2) {}]);
}

使用$inject属性:

下面是两个服务的例子,其中一个依赖另一个,并且这两个服务都依赖Angular框架提供的其他服务:

注意:

  • batchLog服务依赖于内建的$timeout和$log服务,并且允许消息输出到console.log日志文件中。
  • routeTemplateMonitor服务依赖于内建的$route服务就像我们自定义的batchLog服务。
  • 我们的两个服务都使用工厂方法来标识和数组注释来注入注释以声明它们的依赖。这里要注意的是,在数组中字符串的顺序要与在工厂方法的参数列表中的一致。除非依赖是从方法的参数列表中推断出来的,这个带有ID的数组和它们被注入的顺序决定各个服务被注入到哪里。

参考:

『AngularJS』Service的更多相关文章

  1. 『AngularJS』理解$Scope

    理解$Scope 执行概要 在AngularJS,一个子scope通常原型继承于它的父scope.应用于这个规则的表达式是一个使用scope:{...}的指令,这将创建一个『孤岛』scope(非原型继 ...

  2. 『AngularJS』$location 服务

    项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...

  3. 『AngularJS』创建 Service

    创建服务 Angular提供了几种有用的服务,对于所有的应用来说,你将会发现这些服务对于创建你自己的服务是有用处的.为了创建自己的服务,你应该从通过一个模块(module)注册一个服务工厂方法开始(可 ...

  4. 『AngularJS』一点小小的理解

    AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与开发框架不断的提出与发展,而就目前来说,除 ...

  5. 『AngularJS』ngShow

    原文 描述 ngShow指令显示或隐藏给定的基于标明ngShow属性的HTML元素.元素的显示或隐藏通过在元素上移除或添加ng-hide CSS类属性.".ng-hide"CSS类 ...

  6. 『AngularJS』ngValue

    原文 描述 绑定给定的表达式到input[select]或input[radio]的值,以便当这个元素被选中的时候,设置这个元素的ngModel到绑定的值.当需要使用ng-repeat来动态生成rad ...

  7. AngularJS』一点小小的理解

    『AngularJS』一点小小的理解   AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与 ...

  8. 『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现

    『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现 1.基本设定和软件版本 主机名 ip 对应角色 mas ...

  9. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

随机推荐

  1. eclipse集成tomcat 部署项目设置

    ============================================================= 1. 下载安装tomcat插件 ====================== ...

  2. spring异常+自定义以及使用

    1.首先自定义异常 DataException: package com.wbg.maven1128.exception; public class DataException extends Exc ...

  3. 【洛谷P2296】[NOIP2014]寻找道路

    寻找道路 题目链接 这道题非常的水,按照题意, 先反向建边,从终点搜索,标记出可以到达终点的点 然后枚举一遍,判断出符合条件1的点 再从起点搜索一遍就可以了 #include<iostream& ...

  4. 【luogu P2298 Mzc和男家丁的游戏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2298 对于迷宫问题,bfs是比较好的选择. 直接bfs模板 #include <iostream> ...

  5. py faster rcnn的lib编译出错问题

    真是好事多磨啊,计算机系统依然是14.04,而cuda依然是8.0,唯一不同的是时间不一样,下载的各种库版本有差别,GPU的driver不一样. 但是这样就出问题了,py-faster rcnn的li ...

  6. Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616779 本文出自方志朋的博客 简介 采用openresty 开发出的api网关有很多 ...

  7. SpringBoot非官方教程 | 第八篇:springboot整合mongodb

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot8-mongodb/ 本文出自方志朋的博客 这篇文 ...

  8. Viewpager实现今日头条顶部导航的功能

    利用简单的Textview 和Viewpager实现滑动.点击换页的效果,效果图如下: 先上布局文件代码: <?xml version="1.0" encoding=&quo ...

  9. vi常用命令学习

    (1)移动光标 h : 左移光标l : 右移光标j : 下移光标k : 上移光标 w : 移动到下一个单词词头b : 移动到上一个单词词头e : 移动到本单词的尾部 0 :移动到当前行的开端$ :移动 ...

  10. Linux进程间通信---管道和有名管道

    一.管道 管道:管道是一种半双工的通信方式,数据只能单方向流动,而且只能在具有亲缘关系的进程间使用,因为管道 传递数据的单向性,管道又称为半双工管道.进程的亲缘关系通常是指父子进程关系. 管道的特点决 ...