详解JavaScript的AngularJS框架中的表达式与指令


Posted in Javascript onMarch 05, 2016

“指令属性”就是绑定在DOM元素上的函数,它可以调用方法、定义行为、绑定controller及$scope对象、操作DOM,等等等等。

当浏览器启动、开始解析HTML(像平时一样)时,DOM元素上的指令属性就会跟其他属性一样被解析。

当一个Angular.js应用启动,Angular编译器就会遍历DOM树(从有ng-app指令属性的那个DOM元素开始,如我们在本系列第一篇里所提过的),解析HTML,寻找这些指令属性函数。

当在一个DOM元素上找到一个或多个这样的指令属性函数,它们就会被收集起来、排序,然后按照优先级顺序被执行。

每个指令属性都有自己的优先级,在我们关于指令属性的专题文章里(http://www.ng-newsletter.com/posts/directives.html),你可以找到更深入的信息。

Angular.js应用的动态性和响应能力,都要归功于指令属性。之前我们已经看过一些指令属性的用例:

ng-model

<input ng-model="name" name="Name" placeholder="Enter your name"/>
<h4>Your name: {{ name }}</h4>

试试看

详解JavaScript的AngularJS框架中的表达式与指令

ng-model指令属性(我们在之前的章节使用过它),被用来将DOM文本输入框的值,跟controller里的$scope model绑定起来。具体的实现过程,是在这个值上绑定了一个$watch函数(类似JavaScript里的事件监听函数)。

$watch函数(在使用时)运行在Angular.js的事件循环(即$digest循环)里,让Angular.js能够对DOM进行相应的更新。请关注我们关于$digest循环的高级文章!

在Angular.js应用的开发中,我们用指令属性来将行为绑定到DOM上。指令属性的使用,是一个 应用能否拥有动态性、响应能力的关键。Angular.js提供了很多缺省的指令属性,现在让我们来看看其中几个,以及如何使用它们。

几个常见的指令属性:

{{ 表达式 }}

这个双大括号指令属性,使用$watch()函数,给括号内的表达式注册了一个监听器。正是这个$watch函数,让Angular.js能够实时自动更新view。

那么,到底什么算是个表达式?
要想理解指令属性的运作,我们必须先理解表达式,所以这里我们就绕个路,看看本系列的第五部分——表达式。在之前的例子里我们已经见过表达式,例如 {{ person.name }} 和 {{ clock }}。

{{ 8 + 1 }}9
{{ person }}{"name":"Ari Lerner"}
{{ 10 * 3.3 | currency }}$33.00

最后的例子里 (10 * 3.3 | currency) 用了一个过滤器。本系列之后的部分,会深入介绍过滤器。

表达式粗略来看有点像 eval(javascript) 的结果。它们会经过Angular.js的处理,从而拥有以下重要而独特的性质:

所有表达式都在scope这个context里被执行,因此可以使用所有本地 $scope 中的变量。
如果一个表达式的执行导致类型错误或引用错误,这些错误将不会被抛出。
表达式里不允许任何控制函数流程的功能(如if/else等条件语句)
表达式可接受一个或多个串联起来的过滤器。
试试看

详解JavaScript的AngularJS框架中的表达式与指令

试试输入“person“,“clock“或其他数学算式如2+4。你甚至可以操作scope,例如,试试输入person.name = ”Ari”; person.age = 28; person 或 clock

表达式都运行在调用它们的scope里,所以一个表达式可访问并操作其scope上的一切。由此,你可以使用表达式遍历其scope的属性(我们在ng-repeat中会看到这一应用)、调用scope里的函数,或者对scope中的变量进行数学运算。

现在,让我们回到指令属性…

ng-init

ng-init指令属性是一个在启动时运行的函数(在程序进入运行阶段之前)。它让我们能够在程序运行前设定初始变量的值:

<b ng-init='name = "Ari Lerner"'>Hello, {{ name }}</b>

试试看

Hello, Ari Lerner

ng-click

ng-click指令属性给DOM元素注册了一个点击事件的监听器。当此DOM元素上有点击事件发生(即当此button或link被点击时),Angular.js就会执行表达式的内容,并相应地更新view。

<button ng-click="counter = counter + 1">Add one</button>
Current counter: {{ counter }}

试试看

详解JavaScript的AngularJS框架中的表达式与指令

我们也可以用ng-click 来调用在controller里写好并绑定在$scope上的函数,例如:

<button ng-click="sayHello()">Say hello</button>

controller 里的函数:

app.controller('MyController', function($scope) {
  $scope.sayHello = function() {
   alert("hello!");
  }
 });

试试看

详解JavaScript的AngularJS框架中的表达式与指令

ng-show / ng-hide

ng-show和ng-hide指令,根据赋予它们的表达式的值的真假性(truthy),来显示和隐藏它们所属的那一部分DOM。

我们在这里不会深入,但你应该熟悉JavaScript中变量值的“truthy”和“falsy”概念。

<button ng-init="shouldShow = true" ng-click="shouldShow = !shouldShow">Flip the shouldShow variable</button>
 <div ng-show="shouldShow">
  <h3>Showing {{ shouldShow }}</h3>
 </div> <div ng-hide="shouldShow">
  <h3>Hiding {{ shouldShow }}</h3>
 </div>

ng-repeat

ng-repeat指令遍历一个数据集合中的每个数据元素,加载HTML模版把数据渲染出来。被重复使用的模版元素,就是我们绑定了这个指令属性的DOM元素。每一个使用模版渲染的DOM元素都有自己的scope。

在更多的解释之前,我们先看一个例子。假设我们的controller里有这样一个数据元素的数组:

$scope.roommates = [
  { name: 'Ari'},
  { name: 'Q'},
  { name: 'Sean'},
  { name: 'Anand'}
 ];

在view里我们可以用ng-repeat来遍历这个集合里的数据:

<ul>
  <li ng-repeat="person in roommates">{{ person.name }}</li> </ul>

对赋予ng-repeat的表达式稍作改动,我们还可以用它遍历一个由成对的key-value数据组成的集合。例如,假设我们有一个人名和他们最喜欢的颜色的数据集合:

$scope.people = {
  'Ari': 'orange',
  'Q': 'purple',
  'Sean': 'green'
 }

要遍历它,我们可以给ng-repeat指令属性赋予这个表达式: (key, value) in object:

<ul>
  <li ng-repeat="(name, color) in people">{{ name }}'s favorite color is {{ color }}
  </li>
 </ul>

 

Javascript 相关文章推荐
jQuery 扩展对input的一些操作方法
Oct 30 Javascript
JavaScript学习点滴 call、apply的区别
Oct 22 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 Javascript
jQuery中animate用法实例分析
Mar 09 Javascript
js判断图片加载完成后获取图片实际宽高的方法
Feb 25 Javascript
详解js树形控件—zTree使用总结
Dec 28 Javascript
vue实现简单实时汇率计算功能
Jan 15 Javascript
解决IE7中使用jQuery动态操作name问题
Aug 28 jQuery
JS关闭子窗口并且刷新上一个窗口的实现示例
Mar 10 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
May 28 Javascript
JavaScript array常用方法代码实例详解
Sep 02 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
Mar 05 #Javascript
JS判断字符串字节数并截取长度的方法
Mar 05 #Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
Mar 05 #Javascript
js控制TR的显示隐藏
Mar 04 #Javascript
Node.js操作Firebird数据库教程
Mar 04 #Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 #Javascript
node.js微信公众平台开发教程
Mar 04 #Javascript
You might like
yii2 数据库读写分离配置示例
2017/02/10 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
JavaScript中链式调用之研习
2011/04/07 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
详解python持久化文件读写
2019/04/06 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
python with (as)语句实例详解
2020/02/04 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
如何基于Python按行合并两个txt
2020/11/03 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
老同学聚会感言
2014/02/23 职场文书
餐厅总厨求职信
2014/03/04 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
行政前台岗位职责
2015/04/16 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
课改心得体会范文
2016/01/25 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers