通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的。ng的模板真是让我爱不释手。学习ng道路还很漫长,从模板开始入手是个不错方式,因为这部分内容相对简单好理解,而且是视图层的东西,大家都喜欢可以立马看得见的东西嘛。本篇我将搜罗模板中的常用指令一一测试,了解其使用方法,有点像背单词的感觉,会比较枯燥。不过对于初学,这样的枯燥是必须要经历的,开始~

一、模板中可使用的东西及表达式

  模板中可以使用的东西包括以下四种:

  1. 指令(directive)。ng提供的或者自定义的标签和属性,用来增强HTML表现力。
  2. 标记(markup)。即双大括号{{}},可将数据单向绑定到HTML中。
  3. 过滤器(filter)。用来格式化输出数据。
  4. 表单控制。用来增强表单的验证功能。

  其中,指令无疑是使用量最大的,ng内置了很多指令用来控制模板,如ng-repeat,ng-class,也有很多指令来帮你完成业务逻辑,如ng-controller,ng-model。过滤器通常是伴随标记来使用的,将你model中的数据格式化为需要的格式。表单的控制功能主要涉及到数据验证以及表单控件的增强。

  在这里有必要说明一下表达式的概念,毕竟我们模板中大部分使用的都是变量。ng中的表达式与javascript表达式类似但是不可以划等号,它是ng自己定义的一套模式。表达式可以作为指令的值,如ng-modle=”people.name”、ng-click=”showMe()”,看起来是如此像字符串,故而也叫字符串表达式。也可以在标记中使用表达式,如{{1+2}},或者与过滤器一起使用{{1+2 | currency}}。在框架内部,字符串不会简单的使用eval()来执行,而是有一个专门的$parse服务来处理。在ng表达式中不可以使用循环语句、判断语句,事实上在模板中使用复杂的表达式也是一个不推荐的做法,这样视图与逻辑就混杂在一起了。

二、样式相关的指令

  既然模板就是普通的HTML,那我首要关心的就是样式的控制,元素的定位、字体、背景色等等如何可以灵活控制。下面来看看常用的样式控制指令。

  1. ng-class

  ng-class用来给元素绑定类名,其表达式的返回值可以是以下三种:

  1) 类名字符串,可以用空格分割多个类名,如’redtext boldtext’;

  2) 类名数组,数组中的每一项都会层叠起来生效;

  3) 一个名值对应的map,其键值为类名,值为boolean类型,当值为true时,该类会被加在元素上。

  下面来看一个使用map的例子:

ng-class测试

红色 加粗 删除线

map:{redtext:{{red}}, boldtext:{{bold}}, striketext:{{strike}}}

  如果你想拼接一个类名出来,可以使用插值表达式,如:

  <div class=”{{style}}text”>字体样式测试</div>

  然后在controller中指定style的值:

  $scope.style = ‘red’;

  注意我用了class而不是ng-class,这是不可以对换的,官方的文档也未做说明,姑且认为这是ng的语法规则吧。

  与ng-class相近的,ng还提供了ng-class-odd、ng-class-even两个指令,用来配合ng-repeat分别在奇数列和偶数列使用对应的类。这个用来在表格中实现隔行换色再方便不过了。

  2. ng-style

  ng-style用来绑定元素的css样式,其表达式的返回值为一个js对象,键为css样式名,值为该样式对应的合法取值。用法比较简单:

<div ng-style="{color:'red'}">ng-style测试</div><div ng-style="style">ng-style测试</div>$scope.style = {color:'red'};

  3. ng-show,ng-hide

   对于比较常用的元素显隐控制,ng也做了封装,ng-show和ng-hide的值为boolean类型的表达式,当值为true时,对应的show或hide生效。框架会用display:block和display:none来控制元素的显隐。

三、表单控件功能相关的

  对于常用的表单控件功能,ng也做了封装,方便灵活控制。

  ng-checked控制radio和checkbox的选中状态

  ng-selected控制下拉框的选中状态

  ng-disabled控制失效状态

  ng-multiple控制多选

  ng-readonly控制只读状态

  以上指令的取值均为boolean类型,当值为true时相关状态生效,道理比较简单就不多做解释。注意: 上面的这些只是单向绑定,即只是从数据到模板,不能反作用于数据。要双向绑定,还是要使用 ng-model 。

四、事件绑定相关

  事件绑定是javascrpt中比较重要的一部分内容,ng对此也做了详细的封装,正如我们之前使用过的ng-click一样,其他事件的指令如下:

  ng-change

  ng-dblclick

  ng-mousedown

  ng-mouseenter

  ng-mouseleave

  ng-mousemove

  ng-mouseover

  ng-mouseup

  ng-submit

  事件绑定指令的取值为函数,并且需要加上括号,例如:

<select ng-change=”change($event)”></select>

  然后在controller中定义如下:

$scope.change = function($event){alert($event.target);//……………………
}

  在模板中可以用变量$event将事件对象传递到controller中。

  对于ng的这种设计,一些人有所质疑,视图与事件绑定混在一起到底好不好?我们不是要讲究视图与逻辑分离吗?如此一来,把事件的绑定又变回了内联的,岂不是历史的倒退。我也一样对此表示不解,因为不写onclick已经很多年。。。但既然已经存在了,我们不妨往合理的方向上想一想,或许ng的设计者压根就不想让模板成为单纯的视图层,本来就是想增强HTML,让它有一点业务能力。这么想的话似乎也能想通,好吧,先欺骗一下自己吧~

五、特殊的ng-src和ng-href

  在说明这两个指令的特殊之前,需要先了解一下ng的启动及执行过程,如下图:

  1) 浏览器加载静态HTML文件并解析为DOM;

  2) 浏览器加载angular.js文件;

  3) angular监听DOMContentLoaded 事件,监听到时开始启动;

  4) angular寻找ng-app指令,确定作用范围;

  5) 找到app中定义的Module使用$injector服务进行依赖注入;

  6) 根据$injector服务创建$compile服务用于编译;

  7) $compile服务编译DOM中的指令、过滤器等;

  8) 使用ng-init指令,将作用域中的变量进行替换;

  9) 最后生成了我们在最终视图。

  可以看到,ng框架是在DOMcontent加载完毕后才开始发挥作用。假如我们模板中有一张图片如下:

  <img src=”{{imgUrl}}” />

  那么在页面开始加载到ng编译完成之前,页面上会一直显示一张错误的图片,因为路径{{imgUrl}}还未被替换,就像这样:

  为了避免这种情况,我们使用ng-src指令,这样在路径被正确得到之前就不会显示找不到图片。同理,<a>标签的href属性也需要换成ng-href,这样页面上就不会先出现一个地址错误的链接。

  顺着这个思路再多想一点,我们在模板中使用{{}}显示数据时,在ng编译完成之前页面上岂不是会显示出大括号及里面的表达式?确实是这样。为了避免这个,ng中有一个与{{}}等同的指令:ng-bind,同样用于单向绑定,在页面刚加载的时候就不会显示出对用户无用的数据了。尽管这样你可能不但没舒心反而更纠结了,{{}}那么好用易理解,还不能用了不成?好消息是我们依然可以使用。因为我编写的是单页面应用,页面只会在加载index.html的时候出这个问题,只需在index.html中的模板中换成ng-bind就行。其他的模板是我们动态加载的,就可以放心使用{{}}了。

六、总结一下

枯燥的内容终于写完!~在写这篇文章之前我就在纠结,写这样的内容是不是有点多余,因为这些东西在angular官网(http://docs.angularjs.org/api/)一看就明白,而且在线示例也写的很棒。本着不急于求成的原则我还是决定先把这些东西都试一试吧,所以就有详有略的介绍了以上内容,必要的时候也可以当一个备忘。

转载

转载于:https://www.cnblogs.com/HUANGRONG888/p/6201037.html

走进AngularJs(二) ng模板中常用指令的使用方式相关推荐

  1. mysql中的操作指令,MySQL中常用指令操作的介绍(代码示例)

    本篇文章给大家带来的内容是关于MySQL中常用指令操作的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. l 创建数据库:CREATE DATABASE table_n ...

  2. ubuntu中常用指令

    常用指令 清空命令行 Ctrl+L Conda 创建虚拟环境 conda create -n 虚拟环境名称 python=3.7.10 查看虚拟环境列表 conda info --envs 激活虚拟环 ...

  3. java常用工具类_java(二):工作中常用到的工具类

    工作中大家要用到很多工具类,第三方的jar中有很多现成的工具类符合自己的项目需要,这个时候就不需要去重复造轮子了,从而节省了很多时间,大家可以利用这些时间去做其它重要的事情,如果没有符合自己的工具类, ...

  4. 关于Vue中常用指令总结

    前言 关于我们在使用vue相关的技术开发时,经常需要使用到的一些指令和函数,可能由于长时间而被遗忘,对此做一个总结,避免每次都需要利用搜索引擎,既耗时还得确认准确性. 指令 ①v-if,v-else ...

  5. 【云原生 | 从零开始学Docker】二、Docker的常用指令学习以及使用

    该篇文章已经被专栏<从零开始学docker>收录 Docker常用命令使用 一.如何去学习命令 二.镜像常用命令 2.1查看本地所有镜像 2.2 搜索镜像 2.3下载镜像 2.4 删除镜像 ...

  6. 汇编语言中常用指令对标志位寄存器的影响

    参考了<汇编语言 基于x86处理器>第七版 转载请注明出处 如果有错误的地方请指正,谢谢. 文章目录 算术运算(ADD/SUB)影响标志位 ADD指令 SUB指令 NEG指令 INC/DE ...

  7. Docker的使用(二:Docker客户端常用指令练习)

    1.列出镜像: 2.搜索镜像: 3.拉取镜像: 4.构建镜像: 4.1.在Dockerfile文件所在目录构建镜像: 4.2.在其他目录构建镜像: 4.3.查看镜像是否构建成功: 5.删除镜像: 6. ...

  8. 微型计算机DEC影响零标志位吗,汇编语言中常用指令对标志位寄存器的影响

    参考了<汇编语言 基于x86处理器>第七版 转载请注明出处 如果有错误的地方请指正,谢谢. 文章目录 算术运算(ADD/SUB)影响标志位 ADD指令 SUB指令 NEG指令 INC/DE ...

  9. star ccm java api_Star-CCM+二次开发中常用Java小程序

    1. 求最大.最小值方法 #keyname=value key1=e:/prop_367.txt key2=e:/cadmodels/prop_367.x_t key3=stringxxxxxxxxx ...

最新文章

  1. win2003登陸及關機設定
  2. JAVA基础2-输出语句
  3. cgi硬盘安装器_简简单单,玩转虚拟硬盘装多系统
  4. haproxy对mysql集群进行负载均衡
  5. WEB技术架构的资源链接。
  6. 机器学习:SVM算法的对偶形式
  7. Python selenium对js元素进行增删改查操作
  8. 2018/7/6-纪中某C组题【jzoj1192,jzoj1397,jzoj1736】
  9. python按照日期筛选数据_python – 按时间戳列筛选/选择pandas dataframe行
  10. 8年架构师针对web前端小白,作出的职业规划建议
  11. 【SQL】SELECT 语句
  12. python arma_Python实现ARMA模型
  13. android studio翻译插件Translation使用。。
  14. python redis.exceptions.ConnectionError
  15. 建立PCI网卡无盘工作站自动上网(转)
  16. 框架学习(1)——service层,dao层和service实现类进行数据库操作
  17. 数据结构与算法之链表结构寻找p、q最近的公共祖先
  18. 启锐 588 打印机每次打印都流出一部分,没有重新切换纸张
  19. 【解决】g++: error trying to exec ‘cc1plus’: execvp
  20. 一种云化busybox demolets的设想和一种根本降低编程实践难度的设想:免部署无语法编程

热门文章

  1. 新手学vue还是react?
  2. 零基础学前端,自学还是培训机构?
  3. java php cms_内容管理系统的开发策略研究——以PHP CMS、Node.js CMS、Java CMS为例
  4. 计算机网络令牌总线在哪一页,计算机网络应用基础综合练习
  5. 新rust怎么拆除围墙_“问题围挡”拆除 街道变漂亮了
  6. C语言学习笔记---时间函数ctime()和gmtime()
  7. PSIM软件学习---04 子电路的创建
  8. pytorch出现RuntimeError: CUDA out of memory.
  9. matlab 实现行归一化和列归一化
  10. VS Code创建C项目