原文: http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/

Services

Service是单例的. 可以让你在你应用的不同代码块中共享同一个数据.

首先定义一个module.

var module = angular.module( "my.new.module", [] );

接下来, 创建一个service名为Book, 其中有一个json对象包含了一些图书的数据.

module.service( 'Book', [ '$rootScope', function( $rootScope ) {
var service = {
books: [
{ title: "Magician", author: "Raymond E. Feist" },
{ title: "The Hobbit", author: "J.R.R Tolkien" }
], addBook: function ( book ) {
service.books.push( book );
$rootScope.$broadcast( 'books.update' );
}
} return service;
}]);

$rootScope.$broadcast 通知使用Book服务的其他组件books数据被更新了. 现在我们把这个服务传到任何需要他的controllers, directives, filters中去 - 这样他们就能访问Book service的属性和方法了.

var ctrl = [ '$scope', 'Book', function( scope, Book ) {
scope.$on( 'books.update', function( event ) {
scope.books = Book.books;
}); scope.books = Book.books;
}]; module.controller( "books.list", ctrl );

  

我们把Book service中的books数组赋值给controller的scope对象的books属性.

那么这么做的重点是什么呢? 为什么我们不直接在controller里面创建这个books数组了, 这样我们就不要创建Book service了, 这可以节省不少时间呢. 是的 - 这样做确实有可能节省时间 - 但是如果我们需要在其它的地方也使用这个books数组呢? 直接通过scope管理数据是我们不推荐的. Scopes 很容易被其他controller, directive 污染. 在一个统一的地方集中处理book数据对于一个稍大一点的应用都是推荐的. 它让你的数据保持模块化.

CONTROLLERS

Controller应该简单的只是连接service, dependency和其他对象, 并且通过scope把他们传到视图页面. 如果在你的view中有比较复杂的业务逻辑,把这些逻辑放在controller中也是一个不错的选择.

如果我们添加一本书应该怎么做? 应该在controller里面添加一个方法来处理吗? 不. 这属于DOM交互的部分. 应该把这个添加到directive里面去.

DIRECTIVES

在我写过的各式各样的Angular应用中, 我感觉最复杂最难的是directives. 在这篇文章中我们提供一个按钮用来使用service添加一本书.

Angular 定义了directive作为一代码块用来给你操作DOM, 交互的.

module.directive( "addBookButton", [ 'Book', function( Book ) {
return {
restrict: "A",
link: function( scope, element, attrs ) {
element.bind( "click", function() {
Book.addBook( { title: "Star Wars", author: "George Lucas" } );
});
}
}
}]);

上面的代码很简单. 我么创建了一个directive, 使用service添加一本新书. 使用这个directive的代码如下

<button add-book-button>Add book</button>

如你所见, 我们通过attribute使用这个directive.为什么我们不在我们的controller里面添加一个方法添加新书呢:

$scope.addBook = function() {
Book.addBook( { title: "Star Wars", author: "George Lucas" } );
};

在directive或者controller里面处理添加新书的结果是一样的,那为什么我们说要放到directive中来处理而不是controller呢? 如果我想在其它的位置添加新书,我是不是要把这个controller里面的代码复制出来拷贝到想要添加这个功能的地方中去?这样会造成重复代码,给维护带来难度. 通过directive来处理这个就能避免这些问题了.

[译]在AngularJS中何时应该使用Directives,Controllers或者Service的更多相关文章

  1. (译) 在AngularJS中使用的表单验证功能【转】

    验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...

  2. (译) 在AngularJS中使用的表单验证功能

    验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...

  3. AngularJs中的directives(指令part1)

    一.指令的职责   指令的职责是修改DOM结构,并将作用域和DOM连接起来.即指令既要操作DOM,将作用域内的数据绑定到DOM节点上,又要为DOM绑定事件调用作用域内的对应的方法. 二.创建自定义指令 ...

  4. 在AngularJS中的使用Highcharts图表控件

    一.Highcharts简介 Highcharts是一款非常好用的前端图表控件,正如其中文网介绍的那样:功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯js图表库. 如果你的项目是基于jquer ...

  5. AngularJS中的模板安全与作用域绑定

    欢迎大家指导与讨论 : ) 一.前言 摘要:指令compile.$sce.作用域绑定.$compileProvider和其他资源安全设置.本文是笔者在学习时整理的笔记,由于技术还不够高,如果本章中有错 ...

  6. [译]用AngularJS构建大型ASP.NET单页应用(一)

    原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single 渣 ...

  7. 理解AngularJS中的依赖注入

    点击查看AngularJS系列目录 理解AngularJS中的依赖注入 AngularJS中的依赖注入非常的有用,它同时也是我们能够轻松对组件进行测试的关键所在.在本文中我们将会解释AngularJS ...

  8. 用postal.js在AngularJS中实现订阅发布消息

    点击查看AngularJS系列目录 用postal.js在AngularJS中实现event bus 用postal.js在AngularJS中实现event bus 理想状态下,在一个Angular ...

  9. AngularJS中使用Directive、Controller、Service

    AngularJS是一款非常强大的前端MVC框架.同时,它也引入了相当多的概念,这些概念我们可能不是太熟悉. (1)Directive 指令 (2)Controller 控制器 (3)Service ...

随机推荐

  1. VS联调多个解决方案的项目

    一.项目中经常出现一个解决方案里面有多个程序,如果想按F5启动多个实例进行操作调试那该怎么操作? 以前自己都使用附加进程的方法调试,这样的调试不需要按F5,自己只要运行多个程序后,使用vs的附加进程到 ...

  2. SQL请求优化——请求次数统计,SQL写操作稀释

    引言 前几天做了这么一个东西:一个游戏中有个活动页面,活动页面有个商品,商品下面要显示该商品实浏览次数,就相当于是用户每出发一次请求这个浏览总次数都会添加一次,这个问题很简单,每次浏览的时候去数据库中 ...

  3. Java 中常用缓存Cache机制的实现

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 所谓缓存,就是将程序或系统经常要调用的对象存在内存中 ...

  4. C#用HttpClient抓取jd.com搜索框下拉数据

    添加System.Web.dll引用 添加System.Net.Http引用 using System.Net.Http; using System.Web; string key = "电 ...

  5. HDU 4757 Tree

    传送门 Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Prob ...

  6. hdu 2036 - 改革春风吹满地(计算几何)

    题意:求解多边形面积 解法: 先了解数学上"叉积"的含义与性质: 三角形ΔABC的面积为: 我们可以依次计算每个三角形的面积,ΔABC,ΔACE,ΔEF - - 所有三角形的面积之 ...

  7. Mysql配置项的简单优化

    preface 众所周知,Mysql已经成为广泛使用的开源数据库了,so 公司阿里云的数据库为Mysql,在最开始的时候是直接yum安装,配置项都是默认的,没有任何调整,这次有时间就参考各路大神的资料 ...

  8. 修改nginx的访问目录以及遇到的403错误修改总结

    对于这个问题困扰了我好几天,前篇文章介绍了图片服务器的使用,但是两个服务器如何进行通话访问呢,即如何通过nginx来访问ftp服务器上的资源文件呢,这里面需要修改nginx的配置文件(vi /usr/ ...

  9. BZOJ3160: 万径人踪灭

    设a[i]=bool(s[i]=='a'),b[i]=bool(s[i]=='b'),考虑a和a.b和b的卷积,由于卷积是对称的,就可以统计出不连续回文子串个数了.可能说得比较简略.再用manache ...

  10. c中三大区的解析

    1.栈,堆和静态存储区是 堆和静态存储区是C语言程序常涉及的三个基本内语言程序常涉及的三个基本内存区2.栈区主要用于函数调用的使用3.堆区主要是用于内存的动态申请和归还4.静态存储区用于保存全局变量和 ...