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() 的方式编写服务:

 1 // 创建一个模型用来支撑我们的购物视图
 2 var shoppingModule = angular.module(‘ShoppingModule‘, []);
 3
 4 // 设置好服务工厂,用来创建我们的 Items 接口,以便访问服务端数据库
 5 shoppingModule.factory(‘Items‘, function () {
 6     var items = {};
 7     items.query = function () {
 8         return [
 9             {title: ‘Paint‘, description: ‘Pots full of paint‘, price: 3.95},
10             {title: ‘Polka‘, description: ‘Dots with polka‘, price: 2.95},
11             {title: ‘Pebbles‘, description: ‘Just little rocks‘, price: 6.95}
12         ];
13     };
14     return items;
15 });

  控制器就很简单了,但是需要注入 Items 对象:

1 shoppingModule.controller(‘ShoppingController‘, function ($scope, Items) {
2     $scope.items = Items.query();
3 });

  页面可以写个很简单的如下:

 1 <html ng-app="ShoppingModule">
 2     <body ng-controller="ShoppingController">
 3         <script src="../src/angular.js"></script>
 4         <script src="factory.js"></script>
 5         <h1>Shop!</h1>
 6         <table>
 7             <tr ng-repeat="item in items">
 8                 <td>{{item.title}}</td>
 9                 <td>{{item.description}}</td>
10                 <td>{{item.price | currency}}</td>
11             </tr>
12         </table>
13     </body>
14 </html>

  效果如下:

  

12、使用过滤器格式化数据

特别感谢《用 AngularJS 开发下一代 Web 应用》

时间: 2024-10-09 22:48:35

AngularJS 中的常用特性(四)的相关文章

AngularJS 中的常用特性(一)

前言:AngularJS 是一款来自 Google 的前端 JS 框架,该框架已经被应用到了 Google 的多款产品中,这款框架最核心特性有:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注入等待.而且,AngularJS 框架自身是通过 TDD(测试驱动)的方式开发的,从这个角度来看,AngularJS 是敏捷开发的一次成功实践. 引一段<AngularJS 深度剖析和最佳实践>中的话: Angular的学习曲线大概是这样的:入门非常容易,中级的时候会发现需要深入理解很多概念,高级的

AngularJS 中的常用特性(二)

3.列表.表格以及其他迭代型元素 ng-repeat可能是最有用的 Angular 指令了,它可以根据集合中的项目一次创建一组元素的多份拷贝. 比如一个学生名册系统需要从服务器上获取学生信息,目前先把模型之间定义在 JavaScript 代码里面: 1 var students = [{name: 'Mary', id: '1'}, 2 {name: 'Jack', id: '2'}, 3 {name: 'Jill', id: '3'}]; 4 function StudentListContr

AngularJS 中的常用特性(三)

6.表达式  在模板中使用表达式是为了以充分的灵活性在模板.业务逻辑和数据之间建立联系,同时又能避免让业务逻辑渗透到模板中. 1 <div ng-controller="SomeController"> 2 <div>{{recompute() / 10}}</div> 3 <ul ng-repeat="thing in things"> 4 <li ng-class="{highlight: $ind

angularJs中的常用工具方法

前面说过在angularJs中使用 angular.module() 法可创建一个angularJs模块.除此之外,angularJs还提供了一些工具方法供我们使用. angular.isArray() //判断传入的参数是不是数组,是则返回true 否则返回false angular.isDate() //判断传入的参数是不是时间对象,是则返回true,否则返回false angular.isFunction() //判断传入的参数是不是函数,是则返回true,否则返回false angula

AngularJS学习--- AngularJS中XHR(AJAX)和依赖注入(DI) step5

前言:本文接前一篇文章,主要介绍什么是XHR,AJAX,DI,angularjs中如何使用XHR和DI. 1.切换工具目录 git checkout -f step-5 #切换分支 npm start #启动项目 2.什么是XHR和依赖注入(Dependency Injection)? 1)什么是XHR? XHR是XMLHttpRequest的简称,XMLHttpRequest 用于在后台与服务器交换数据,主要是为了实现在不重新加载整个网页的情况下,对网页的某部分进行更新.简单说,浏览器中URL

Java EE中常用的四个框架

Java EE中常用的四个框架     Struts     Struts是一个基于Sun Java EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.     Struts框架可分为以下四个主要部分,其中三个就和MVC模式紧密相关:     1.模型 (Model),本质上来说在Struts中Model是一个Action类(这个会在后面详细讨论),开发者通过其实现商业逻辑,同时用户请求通过控制器(Controller)向Action的转发过程是基于由struts-config

AngularJS 的常用特性(五)

13.使用路由和 $location 切换视图 对于一些单页面应用来说,有时候需要为用户展示或者隐藏一些子页面视图,可以利用 Angular 的 $route 服务来管理这种场景. 你可以利用路由服务来定义这样的一种东西:对于浏览器所指向的特定 URL,Angular 将会加载并显示一个模板,并实例化一个控制器来为模板提供内容. 在应用中可以调用 $routeProvider 服务上的函数来创建路由,把需要创建的路由当成一个配置块传给这些函数即可.伪代码如下: 1 var someModule

iOS中常用的四种数据持久化方法简介

iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就够用了 @interface User : NSObject <NSCoding>@property (nonatomic, assign) NSInteger userID;@property (nonatomic,

【学习笔记】——原生js中常用的四种循环方式

一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出"欢迎下次光临" 在网页中弹出框输入1   网页输出"查询中--" 在网页中弹出框输入2   网页输出"取款中--" 在网页中弹出框输入3   网页输出"转账进行中--" 在网页中弹出框输入其他字符   网页输出"无效按键" 四种循环: for循环 while循环 for  in