AngularJS 的常用特性(四)
11、使用 Module(模块) 组织依赖关系
Angular 里面的模板,提供了一种方法,可以用来组织应用中一块功能区域的依赖关系;同时还提供了一种机制,可以自动解析依赖关系(又叫依赖注入),一般来说,我们把这些叫做依赖服务,因为它们会负责为应用提供特殊的服务。
例如,如果购物站点中的一个控制器需要从服务器中获取一个商品列表 Items,来处理从服务器获取商品的工作。进而,Items 对象就需要以某种方式与服务器上的数据库进行交互,可以通过 XHR 或者 WebSocket。
如果,在没有模块的情况下,那么代码看起来就像下面这样:
function ItemsViewController($scope) {
    // 向服务器发起请求
    ...
    // 解析响应并放入 Item 对象
    ...
    // 把 Items 数组设置到 $scope 上,这样视图才能够显示它
    ...
}
虽然这么做可以运行,但是存在一些潜在的问题:
- 如果其他控制器也需要从服务器获取 Items,那么我们只能把这段代码重写一遍,代码维护工作增大难度;
 - 加上其他的一些因素,例如服务器认证、解析数据的复杂性,会使控制器对象很难划分出一个合理的功能边界,并且代码阅读起来更加困难;
 - 增加单元测试的难度,要测试这段代码,必须启动一个真正的服务器。
 
利用模块和模块内置的依赖注入功能,我们可以把控制器写得更加简单,示例如下:
function ShoppingController($scope, Items) {
    $scope.items = Items.query();
}
这样会很简单而且方便,只需要把 Items 对象定义成了一个服务。
服务都是单例的对象,Angular 内置了很多服务,例如 $location 服务,用来和浏览器的地址栏进行交互;$route 服务,用来根据 URL 地址的变化切换视图;还有 $http 服务,用来和服务器进行交互。
你也可以自定义自己的服务,但最好不要以 $ 开头,因为 Angular 内置的服务是以 $ 符号开头的,以免引起冲突。
你可以使用模型对象的 API 来定义服务,如下表格:
——————————————————————————————————————————————————————————————————————
  函数                     |  定义
  ——————————————————————————————————————————————————————————————————————
provider(name, Object OR constructor()) | 一个可配置的服务,如果你传递了一个 Object 作为参数,那么该对象必须带有一个名为 $get 的函数,
| 该函数需要返回服务的名称。否则,认为你传递的是一个构造函数,调用构造函数会返回服务实例对象。
——————————————————————————————————————————————————————————————————————
factory(name, $getFunction()) | 一个不可配置的服务,需要你指定一个函数,当调用这个函数的时候,会返回服务的实例。
| 可以用把它看成 provider (name, { $get: $getFunction()}) 的形式
——————————————————————————————————————————————————————————————————————
service(name, constructor()) | 一个不可配置的服务,与上面 provider 函数的constructor 参数类似,调用它可以创建服务实例
——————————————————————————————————————————————————————————————————————
下面用 factory() 的方式编写服务:
 // 创建一个模型用来支撑我们的购物视图
 var shoppingModule = angular.module('ShoppingModule', []);
 // 设置好服务工厂,用来创建我们的 Items 接口,以便访问服务端数据库
 shoppingModule.factory('Items', function () {
     var items = {};
     items.query = function () {
         return [
             {title: 'Paint', description: 'Pots full of paint', price: 3.95},
             {title: 'Polka', description: 'Dots with polka', price: 2.95},
             {title: 'Pebbles', description: 'Just little rocks', price: 6.95}
         ];
     };
     return items;
 });
控制器就很简单了,但是需要注入 Items 对象:
 shoppingModule.controller('ShoppingController', function ($scope, Items) {
     $scope.items = Items.query();
 });
页面可以写个很简单的如下:
 <html ng-app="ShoppingModule">
     <body ng-controller="ShoppingController">
         <script src="../src/angular.js"></script>
         <script src="factory.js"></script>
         <h1>Shop!</h1>
         <table>
             <tr ng-repeat="item in items">
                 <td>{{item.title}}</td>
                 <td>{{item.description}}</td>
                 <td>{{item.price | currency}}</td>
             </tr>
         </table>
     </body>
 </html>
效果如下:
  
12、使用过滤器格式化数据
你可以用过滤器来声明应该如何变换数据格式,然后再显示给用户,只要在模板中使用一个插值变量即可,过滤器的语法如下:
{{ expression | filterName : parameter1 : ... parameterN}}
Angular 的内置过滤器,比如 currency:
{{12.9 | currency}}
显示结果为:
$12.90
还有其他过滤器,比如 date、number、uppercase 等,可以连用:
{{12.9 | currency | number : 0}}
显示结果为:
$13
当然,我们经常需要自定义过滤器,比如我们需要为标题文字创建首字母大写的字符串,编写过滤器如下:
 var homeModule = angular.module('HomeModule', []);
 homeModule.filter('titleCase', function () {
     return function (input) {
         var words = input.split(' ');
         for (var i = 0; i < words.length; i++) {
             words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1);
         }
         return words.join(' ');
     };
 });
 homeModule.controller('HomeController', function ($scope) {
     $scope.pageHeading = 'behold the majesty of your page title';
 });
简单的模板页面:
 <html>
     <body ng-app="HomeModule" ng-controller="HomeController">
         <script src="../src/angular.js"></script>
         <script src="filter.js"></script>
         <h1>{{pageHeading | titleCase}}</h1>
     </body>
 </html>
显示结果如下:
  
特别感谢:《用 AngularJS 开发下一代 Web 应用》
AngularJS 的常用特性(四)的更多相关文章
- AngularJS 的常用特性(五)
		
13.使用路由和 $location 切换视图 对于一些单页面应用来说,有时候需要为用户展示或者隐藏一些子页面视图,可以利用 Angular 的 $route 服务来管理这种场景. 你可以利用路由服务 ...
 - AngularJS 的常用特性(一)
		
前言:AngularJS 是一款来自 Google 的前端 JS 框架,该框架已经被应用到了 Google 的多款产品中,这款框架最核心特性有:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注入 ...
 - AngularJS 的常用特性(三)
		
6.表达式 在模板中使用表达式是为了以充分的灵活性在模板.业务逻辑和数据之间建立联系,同时又能避免让业务逻辑渗透到模板中. <div ng-controller="SomeContr ...
 - AngularJS 的常用特性(二)
		
3.列表.表格以及其他迭代型元素 ng-repeat可能是最有用的 Angular 指令了,它可以根据集合中的项目一次创建一组元素的多份拷贝. 比如一个学生名册系统需要从服务器上获取学生信息,目前先把 ...
 - AngularJS 最常用的几种功能
		
AngularJS 最常用的几种功能 2017-04-13 吐槽阿福 互联网吐槽大会 第一 迭代输出之ng-repeat标签ng-repeat让table ul ol等标签和js里的数组完美结合 1 ...
 - Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类
		
前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...
 - Vue的常用特性
		
Vue的常用特性 一.表单基本操作 都是通过v-model 单选框 1. 两个单选框需要同时通过v-model 双向绑定 一个值 2. 每一个单选框必须要有value属性 且value值不能一样 3. ...
 - Java8新特性—四大内置函数式接口
		
Java8新特性--四大内置函数式接口 预备知识 背景 Lambda 的设计者们为了让现有的功能与 Lambda 表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念. 什么是函数式接口? 函数 ...
 - 探索ASP.NET MVC5系列之~~~4.模型篇---包含模型常用特性和过度提交防御
		
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
 
随机推荐
- linux常见命令-查看磁盘空间
			
linux查看磁盘使用情况命令 1. 统一每个目录下磁盘的整体情况: df -h 2. 查看指定目录,在命令后直接放目录名,比如查看“usr”目录使用情况:df -h /usr/ 3. 查看当前目录 ...
 - Android-ImageUtils工具类
			
图片相关的工具类 public class ImageUtils { public static boolean saveImage(Bitmap photo, String spath) { try ...
 - App与微信WebAPP
			
我的App与微信搞上了 小麦积分墙摘自网络 最近有很多开发者关心的一个问题是如何提升app的下载量,透过现象开本质,app下载量的终极目标还是为多少客户提供了服务,抛开下载量KPI,app真心关心的问 ...
 - [Erlang22]如何按规则位数输出数字
			
需求:把一个数字指定长度输出 例如: 1 00000001 12 00000012 1203 00001203 123456789 123456789 1234567 01234567 方法一: ...
 - 朋友,请待你的朋友——BUG好一点!
			
程序猿嘛,难免会被BUG缠身,我相信,没有一个程序猿在被BUG缠身时是感觉轻松的,消灭BUG一定是你最大的愿望.本周,我们团队的项目进入调试阶段,各种BUG层出不穷,眼看下个周就要进行项目答辩会,所以 ...
 - WPF制作歌词动画
			
最近再做一个UWP的音乐播放器,今天实现了歌词动画,不是滚动的,滚动的慢慢研究 思路:在右边放了三个textBlock,设置 textBlock的effect属性 <TextBlock.Effe ...
 - python中的内置函数(一), lambda, filter, map
			
https://www.processon.com/view/link/5c10da0ce4b099ae3e137bf6 1.内置函数 内置函数就是python中提供的,可以直接拿来用的函数,比如pr ...
 - 学习xss模拟构造攻击(第一篇)
			
本文作者:i春秋签约作家——rosectow 0×00前言 XSS又名叫CSS全程(cross site scriptting),中文名跨站脚本攻击,目前网站的常见漏洞之一,它的危害没有像上传漏洞,s ...
 - JMeter PerfMon Metrics Collector性能监控插件
			
官方文档地址https://jmeter-plugins.org/wiki/PerfMon/ JMeter是一款压力测试工具,我们也可以用它来监控服务器资源使用情况. JMeter正常自带可以通过To ...
 - 10分钟教你用Python打造微信天气预报机器人
			
01 前言 最近武汉的天气越来越恶劣了.动不动就下雨,所以,拥有一款好的天气预报工具,对于我们大学生来说,还真是挺重要的了.好了,自己动手,丰衣足食,我们来用Python打造一个天气预报的微信机器人吧 ...