AngularJS 指令解析(一)
AngularJS 指令解析(一)
前言
笔者AngularJS接触时间差不多是两年多,虽然这两年多AngularJS版本日新月异,但是笔者的版本是比较老的1.4.3,一方面是自己对这个版本比较熟悉,另一方面是老项目需要维护,当然本文笔者也尽可能地写到通俗易懂,毕竟AngularJS在很多设计上也有独到之处,但是人无完人,笔者可能有疏漏的话,烦请提醒留言。下面回归正文,总体而言,AngularJS在设计上有两点比较重要的地方,分别是指令(directive)和作用域(scope)。directive实现了对常用DOM操作的简要封装,而渲染的数据源于scope,而这中间的媒介(或者说是反应的容器、载体)是controller,三者相互作用形成AngularJS的基础设计模式。MVVM框架下就需要双向绑定,而双向绑定的实现是基于脏值检测的digest loop,这也是AngularJS设计比较先进的地方(当然也有缺陷,这个后续再讲)。
本文入门门槛比较高,若对AngularJS刚接触的同学请先看一下官方教程,第一讲重点讲scope,后续讲指令。
AngularJS数据交互示意图:

通常来说AngularJS通过scope来抽象化地实现directive和DOM之间的交流,而scope存在controller上的,因此AngularJS不会过多干涉原生的东西,而是拓展一些新的带$前缀的内部功能属性,比如以一个$符号的前缀,以两个$($$)符号作为前缀的是AngularJS的私有属性,一般不推荐使用。
scope的作用范围
在AngularJS中,一个scope(作用域)必须与标签元素关联,而标签元素却不一定跟scope关联,它们之间不是充要条件,元素可以通过以下三种方式被指定到一个scope上。
- 通过controller或者directive,scope会被指定在一个标签元素上
- 若标签元素上没有指定,则继承于父标签上的scope
- 反之,则不指定为任何一个scope
第一和第二种情况若接触过AngularJS,则不难理解,第三种情况属于超出AngularJS的执行范围即在ng-app指令范围之外。
digest循环
digest循环是数据双向绑定的关键,也是AngularJS设计上的关键。AngularJS是基于数据绑定特征,通过一个脏值检测循环去追踪数据变化和事件变化,而数据绑定在scope上的,因此scope上肯定有触发这一检测的方法,而这个就是scope.$digest方法,相应的状态表现为$$phase。
- $digest-触发digest循环
- $$phase-digest循环执行状态{null, '$apply', '$digest'}
讲这一过程的之前我们先介绍watcher(监听器)及相关属性
$wathch
- $watch(watchExp, listener,objectEquality)-增加scope监听器
- $watchCollection-监听数据对象或者数组
- $$watchers-保持监听器与scope的关联
数据双向绑定的基础就是$wathch,而数据及时的更新变化却要依赖于$digest循环,当你每次使用ng-bind,ng-model时都会自动创建一个$watch,因此每当数据变化时都会及时更新到界面上,那么问题来了,这个及时的背后依靠的是什么呢?又是什么时候触发$digest呢?
$digest触发时机
digest在AngularJS设计上处于核心的位置,要么被直接触发,要么手动调用$apply触发,而思路上就是service、directive导致直接或者间接地触发了digest,而digest触发了scope上的watcher,watcher更新界面数据,这是设计上最基本的思路。
而这个间接指的是有些AngularJS封装过的函数,比如$timeout服务内置$apply方法。而这个直接是指ngModel或者ngBind值上的变更直接导致watcher触发digest。
AngularJS 指令解析(一)的更多相关文章
- AngularJS 指令解析(二)
AngularJS 指令解析(二) 第一篇我们讲过了作用域(scope)这块内容,现在我们进入正题,讲AngularJS的指令. 什么是指令? 这里我们引用官方的一句话: Custom directi ...
- AngularJs指令(一)
AngularJs应用现在越来越流行了,谷歌都与微软合作支持AngularJS2.0,这是要逆天了,说明AngularJs将来大势所趋.最近想跳槽,又重新拾起了AngluarJs(之前由于缺少项目应用 ...
- angularJS 指令二
指令详解1.用directive()方法来定义指令.directive('myDirective',function($timeout,userDefinedService){ return {};} ...
- AngularJS指令进阶 – ngModelController详解
AngularJS指令进阶 – ngModelController详解 在自定义Angular指令时,其中有一个叫做require的字段,这个字段的作用是用于指令之间的相互交流.举个简单的例子,假如我 ...
- 不用搭环境的10分钟AngularJS指令简易入门01(含例子)
不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...
- AngularJS 指令生命周期 complie link
AnguarJS指令从解析到生效一共会经历Inject.Compile.Controller加载.Pre-link.Post-link这几个主要阶段. 一.AngularJS指令执行过程 1.加载An ...
- AngularJS指令
1. AngularJS指令的特点: AngularJS通过被称为指令的新属性来扩展HTML,指令的前缀为ng-. AngularJS通过内置的指令来为应用添加功能. AngularJS允许你自定义指 ...
- angularjs指令参数transclude
angularjs指令参数transclude transclude翻译为嵌入,和之前看到的vue中的slots作用差不多,目的是将指令元素的子内容嵌入到指令的模板中 定义指令 <div sid ...
- angularjs 指令—— 绑定策略(@、=、&)
angularjs 指令—— 绑定策略(@.=.&) 引入主题背景:angular 的指令配置中的template可以直接使用硬编码写相应的代码,不过也可以根据变量,进行动态更新.那么需要用到 ...
随机推荐
- Python中使用Beautiful Soup库的超详细教程
[参考文献] http://www.jb51.net/article/65287.htm
- redis修改密码和更改端口
Liunx下redis修改密码和更改端口 redis一个实例就是一个节点,每个节点分配一个端口号,每个节点对应一个redis.conf配置文件. redis默认配置的端口号是6379,假设现在要多配置 ...
- Folyd算法(转+适合问题 )
Folyd算法适合多源最短路的求解问题(时间复杂度(O(n^3)),单源无负权值的问题适合Dijstra(O(n^2)) 小Hi强行装作没听到,继续说道:"这个算法的核心之处在于数学归纳法- ...
- Codeforces 316C2 棋盘模型
Let's move from initial matrix to the bipartite graph. The matrix elements (i, j) for which i + j ar ...
- 关于Django的视图层
视图函数 通俗来讲:视图函数是在url配置是所匹配好了将要调用的对应函数(逻辑代码) 是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容 ...
- windows logstash配置
E:\logstash-6.2.4\bin目录下新建logstash.conf input { stdin { } } output { stdout { codec=> rubydebug } ...
- man bash 关于shell的应有尽有 语法、快捷键...
文件加载顺序 for if case ... 语法 往前移动一个单词 alt f https://github.com/hokein/Wiki/wiki/Bash-Shell%E5%B8%B8%E7% ...
- asp.net core WebAPI学习以及 发布(***入门学习)
A asp.net Core 系列[一]——创建Web应用 asp.net Core 系列[二]—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API a ...
- Java学习笔记day06_自定义类_ArrayList
1.自定义类class 使用类的形式, 对现实中的事物进行描述. 类是引用数据类型. 事物: 方法,变量. 方法:事物具备的功能. 变量:事物的属性. 格式: public class 类名{ //属 ...
- 转 PyCharm 进行调试 以及怎么熟悉一个已经成熟的项目的代码和断点 以及 jetBrains pycharm快捷键
https://blog.csdn.net/guider2334/rss/list Ctrl + Q 现实document视图,查看选择元素的详细信息 (重要) Ctrl + Alt + ...