AngularJS是一款非常强大的前端MVC框架。同时,它也引入了相当多的概念,这些概念我们可能不是太熟悉。

(1)Directive 指令

(2)Controller 控制器

(3)Service 服务

下面我们逐个来看这些概念,研究一下为什么它们会像当初设计的那样强大,同时研究一下为什么我们要以那样的方式去使用它们。

一、SERVICES 服务

如果你已经使用过AngularJS,你可能已经遇到过Service这个概念了,简而言之,Service就是 单例对象 在AngularJS中的一个别名。这些小东西(指单例对象)会被经常传来传去,保证你每次访问到的都是同一个实例。

这一点和工厂模式不同。

基于这种思想,单例对象让我们可以实现一些相当酷的功能,它可以让很多controllerdirective访问内部的数值。

我们来看一个非常常见的问题,那就是在应用中的不同代码块之间如何共享数据?

我们首先创建一个module(模块),本文中的所有代码都会用到这个module。

// 创建一个angularjs的module
var module = angular.module('my.new.module', []); // 这里的第二个空参数一定要有

下一步,我们来创建一个新的service(服务)。假设我们上面的这个module是用来管理图书的。所以,这里我们来创建一个Book Service,然后把一个JSON对象数组添加到这个service中。

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;
}
]);

这个一个非常简单的service(有时候这样的service其实就够用了)。我们这里正在做的事情就是在管理一个book数组,同时还带有一个addBook方法,在有需要的时候可以添加更多的书籍。addBook方法还会在application上

广播一个事件,告诉所有正在我们服务Book的人,数组已经被更新了,从而让它们自己也做一些刷新操纵。

现在,我们要做的就是把这个service传递给各种controller、directive、filter,或者其他任何需要它的东西,然后它们就可以访问service中提供的这些方法和属性了。

下面我们声明一个controller:

module.controller('books.list', [
'$scope',
'Book',
function($socpe, Book) {
// books.update事件监听
$scope.$on('books.update', function(event) {
$scope.books = Book.books;
$scope.$apply();
}); $scope.books = Book.books;
}
]);

同样非常简单。我们上面所做的就是为了我们的module创建了一个新的controller。在创建的时候把$scope.provider和我们自己的Book service传递给了它。能明白我们在干嘛吗?我们把前面创建的Book service中的

books数组赋给了controller内部的局部$scope对象。很酷,对吧?

好,这里的核心问题是什么呢?我们节省了一些时间,并且在controller上创建了一个数组。对,我们确实这样做了。这样做确实也为我们节约了一点时间,但是如果我们要在其它地方处理这些书籍信息应该怎么办呢?

通过$scope来维护数据是非常粗暴的一种方式。由于其它controllerdirectivemodel的影响,$scope很容易就会崩溃或者变脏。它很快就会变成一团乱麻。通过一种集中的途径(在这里 就是service)来管理所有书

籍数据,然后通过某种方式来请求修改它,这样不仅仅会更加清晰,同时当应用的体积不断增大的时候也更加容易管理。最后,它还可以让你的代码保持模块化(这也是Angular很擅长的一件事情)。一旦你在其它项目

中需要用到这个service,你没有必要在$scope、 controllerfilter等等东西里面到处去查找相关的代码,因为所有东西都在service里面!

好。那么我们什么时候应该使用service呢?答案是:无论何时,当我们需要在不同的域中共享数据的时候。另外,多亏了Angular的 依赖注入系统 ,实现这一点是很容易并且很清晰的。

二、CONTROLLERS 控制器

我们再来看控制器!

除非你曾经使用过前端MVC,否则从服务端MVC的思维模式转向客户端MVC的思维模式就如同一次脑筋急转弯。为什么会这样呢?

这是因为,虽然在前端开发中controller实现了非常类似的功能,但是它同时还会实现一些与服务端controller非常不同的功能。在 Angular中,controller自身并不会处理request,除非它是用来处理路由(route)的(很多人

把这种方式叫做创建route controller,路由控制器),更明确地说,尤其是你的应用里面那些作为界面的一部分的controller,它们只会管理非常小的一段代码。

controller应该纯粹地用来把service、依赖关系、以及其它对象串联到一起,然后通过$scope把它们关联到view上。如果在你的视图里面需要处理复杂的业务逻辑,那么把它们放到controller里面也是一个非常不错的选择。回

到我们前面的这个books例子,我实际上并没有什么东西需要添加到controller里面。

但是如果我要add一本书籍应该怎么办呢?我应该在controller上面新增一个方法来处理这件事情吗? 不,原因在下面解释。因为它是DOM交互/操作的一部分。所以请把它放到directive(指令)里面。怎么做呢?很高兴你能问

出这个问题。

三、DIRECTIVES 指令

到目前为止,在我们所编写的大量AngularJS应用中,应用中最主要的复杂部分都在directive(指令)中。有一个强大的工具可以用来操作和修改DOM,它也是我们这里需要讨论的内容。我们来提供一个按钮,用户通过它

可以向service里面添加一本图书,以这一功能来结束此文。

一个常见的反模式(即反面教材)是在controller里面添加DOM交互代码。Angular对directive的定义是一段代码片段,你可以用它来操作DOM,但是我觉得directive也是进行用户交互的很好选择。我们来扩展前面的例

子,为用户提供一个按钮,通过这个按钮可以向service里面添加一本书籍。

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"
});
});
}
};

]);

很简单的东西。我们创建了一个指令,它的核心目的是简单地向books列表中添加一本书籍,books已经注册在了我们的Book服务中。我们来把这个指令应用到我们的视图中。

好了,我们为什么不直接在控制器上面添加一个addBook之类的方法呢,比如说就像下面这样:

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

一旦我需要在其它地方添加书籍,我必须拷贝这份代码(非常un-DRY!,DRY—-Dont Repeat Yourself,貌似是Ruby所倡导的一个重要的编码原则。),或者进行重构(重构本身并不是什么不好的的事情)。通过直接构

建一个指令的方式,我们以后就没有必要担心这种事情了,同时下次再需要实现相同功能的时候完全不需要花任何时间。通过构建指令的方式来进行DOM交互和修改,随着业务需求的不断介入,我们就可以立即腾出手来处理复杂性不断增加的应用了。这是相当不错的一件事情,因为它保证了我们可以更少地和自己的实现打架,并且可以一直编写DRYer code。

转载自:https://blog.csdn.net/qq_21577869/article/details/47147719

AngularJS中使用Directive、Controller、Service的更多相关文章

  1. angularjs中的directive scope配置

    angularjs中的directive scope配置 定义directive其中重要的一环就是定义scope,scope有三种形式: 默认的scope,DOM元素上原有的scope scope: ...

  2. AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法

    简介AngularJS中使用factory和service的方法 AngularJS支持使用服务的体系结构"关注点分离"的概念.服务是JavaScript函数,并负责只做一个特定的 ...

  3. AngularJS中有关Directive的汇总

    本篇通过几个例子对AngularJS中的Directive进行汇总. 例子1,单向绑定和双向绑定 <html ng-app="myApp"> <head> ...

  4. angularjs中的directive

    正在初学angularjs中,在网上看到一篇详细讲解directive指令的文章,于是就记录在这里和大家一起分享 angular.module('docsTransclusionExample', [ ...

  5. angularJs中自定义directive的数据交互

    首先放官方文档地址:https://docs.angularjs.org/guide/directive 就我对directive的粗浅理解,它一般用于独立Dom元素的封装,应用场合为控件重用和逻辑模 ...

  6. 【AngularJS中的自定义服务service VS factory VS provider】---它们的区别,你知道么?

    在介绍AngularJS自定义服务之前,我们先来了解一下AngularJS~ 学过HTML的人都知道,HTML是一门很好的伪静态文本展示设计的声明式语言,但是,要构建WEB应用的话它就显得乏力了. 而 ...

  7. AngularJS中如何对Controller与Service进行分层设计与编码

    初学者的Controller 在我们当接触NG后,如需要通过访问远程的API获取一系列的数据进行显示,通常我的Controller代码会写成下面的样子: angular.module('demo') ...

  8. AngularJS 中的 factory、 service 和 provider区别,简单易懂

    转自:http://blog.csdn.net/ywl570717586/article/details/51306176 初学 AngularJS 时, 肯定会对其提供 factory . serv ...

  9. 简介AngularJS中使用factory和service的方法

    AngularJS支持使用服务的体系结构“关注点分离”的概念.服务是JavaScript函数,并负责只做一个特定的任务.这也使得他们即维护和测试的单独实体.控制器,过滤器可以调用它们作为需求的基础.服 ...

随机推荐

  1. Mysql主键一致时,可以进行在元数据上的操作

    insert into daliy_hit_counter(day,slot,cnt) values(12,12,1) on duplicate key update cnt = cnt +1 dal ...

  2. powerdesigner约束名唯一出错的解决办法

    powerdesigner中自动生成的约束名有时会因为表的前缀一样而不具有唯一性,这样在生成时就会出错,一般的解决办法有以下两种: 1.模型=>Reference中可以看到当前模型中的所有Ref ...

  3. 使用 Scene 类在 XNA 中创建不同的场景(八)

    平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...

  4. python-高级编程-02

    [yield 详解 协同程序 生成器表达式] 1> yield def res (): for i in range(10): x = yield i r = res() print r.nex ...

  5. LiveScript 操作符

    The LiveScript Book     The LiveScript Book 操作符 数字 标准的数学操作符: 1.1 + 2 # => 32.3 - 4 # => -13.6 ...

  6. struts2和spring的两种整合方式

    首先,来看看如何让Spring 来管理Action. 在struts.xml中加入 <constant name="struts.objectFactory" value=& ...

  7. client三大家族区别(三大家族总结)

    目录 目录 2 今日内容: 4 第1章 第三大家族client 4 1.1 主要成员 4 1.2 三大家族区别(三大家族总结) 5 1.2.1 Width和height 5 1.2.2 top和lef ...

  8. iOS--app自定义相册--从自定义的相册中获取图片

    一.获取单张图片 思路: 1.利用UIImagePickerController可以从系统自带的App(照片\相机)中获得图片 2.设置代理,遵守代理协议 注意这个UIImagePickerContr ...

  9. 《Spark Python API 官方文档中文版》 之 pyspark.sql (四)

    摘要:在Spark开发中,由于需要用Python实现,发现API与Scala的略有不同,而Python API的中文资料相对很少.每次去查英文版API的说明相对比较慢,还是中文版比较容易get到所需, ...

  10. 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演

    题目描述 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生 ...