原文: 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. Jenkins参数化构建插件,实现构建前输入自定义参数

    插件: [Build with Parameters]:https://wiki.jenkins-ci.org/display/JENKINS/Build+With+Parameters+Plugin ...

  2. jQuery—选择器

    摘抄自<锋利的jQuery> 一.基本选择器 $("#one").css("background","#bbffaa"); 选取 ...

  3. Session对象

    Session对象用于存储在多个页面调用之间特定用户的信息.Session对象只针对单一网站使用者,不同的客户端无法互相访问.Session对象中止于联机机器离线时,也就是当网站使用者关掉浏览器或超过 ...

  4. CF 161B Discounts(贪心)

    题目链接: 传送门 Discounts time limit per test:3 second     memory limit per test:256 megabytes Description ...

  5. How to overcome “datetime.datetime not JSON serializable” in python?

    json.dumps(datetime.now) 意思是datetime.now不可json序列化,解决办法是转化成str或者加一个参数 cls=xxx 详细见: http://stackoverfl ...

  6. BZOJ2599 [IOI2011]Race

    传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...

  7. the setting of serial port in the SecureCRT

    set echo(display characters which are sent) Line wrap        : press 'enter' to send '\r'(0x0D), go ...

  8. 一个叫<NameValuePair>的东西~~~

    public String getInviteRelation(String phone){ String url = PropertiesUtil.getPropertyValue("HH ...

  9. Myeclipse如何设置字体大小

    由于Myeclipse一般是英文版的,这就给英语不太好的人带来了一定的麻烦,有时连设置个字体都无法顺利进行!!! 工具/原料   Myeclipse 方法/步骤   双击启动Myeclipse 点击& ...

  10. select例子

    好长时间没有写了,其实一直在坚持学习. #include <sys/types.h> #include <sys/socket.h> #include <stdio.h& ...