`
liujiekasini0312
  • 浏览: 147291 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

通过使用模板,我们可以把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/)一看就明白,而且在线示例也写的很棒。本着不急于求成的原则我还是决定先把这些东西都试一试吧,所以就有详有略的介绍了以上内容,必要的时候也可以当一个备忘。

学英语有两种方法,一种是先做题,遇到不会的单词再查,另一种是先拿着单词本背。尽管专家好像更推荐前者,但如果你现在一窍不通,还是老老实实先背单词吧~

分享到:
评论

相关推荐

    AngularJs后台管理模板

    3. **指令系统**:AngularJS扩展HTML的能力,通过自定义指令实现功能增强,如ng-repeat用于循环,ng-if用于条件渲染,ng-model用于双向数据绑定等。 4. **模块化**:AngularJS应用由多个模块组成,每个模块都有特定...

    angularjs,ng-repeat循环渲染时,无法获取dom对象.pdf

    在AngularJS中,`ng-repeat`是用于循环渲染HTML元素的一个指令,它能够帮助开发者根据数组或者对象集合的内容重复渲染出一组DOM元素。然而,在使用`ng-repeat`进行渲染的过程中,有时候开发者会遇到无法直接获取到...

    Angularjs标签模板加载原理

    在AngularJS中,模板是一段HTML代码,其中包含了AngularJS特定的指令(如`ng-repeat`, `ng-if`, `ng-model`等),这些指令会被AngularJS编译并执行,从而动态地生成和更新视图。模板可以存在于HTML文件中,也可以...

    angularJS模板

    在AngularJS中,模板是一种特殊的HTML文档,它包含了AngularJS的特定元素、属性和指令,这些元素和指令帮助我们创建动态和交互式的用户界面。AngularJS通过解析这些模板,将它们与应用程序的数据模型结合,生成最终...

    Angularjs+Html后台模板

    4. 适配移动设备:确保模板在不同屏幕尺寸和设备上都能良好显示,可能需要使用响应式设计或AngularJS的ngCloak等指令。 5. 测试与优化:在不同浏览器和环境下进行测试,确保兼容性,并通过性能优化技术如懒加载、...

    Angularjs中ng-repeat的简单实例

    在讲解AngularJS中ng-repeat指令的使用实例之前,我们需要先对AngularJS和ng-repeat指令做一个基本的了解。 AngularJS是Google开发的一个开源的前端JavaScript框架,用来开发动态网页。它通过HTML的扩展(即所谓的...

    基于angularjs的php模板引擎

    模板引擎如Smarty则用于渲染返回给前端的HTML片段,这些片段可以被AngularJS的ng-bind指令或其他指令进一步处理,形成最终的用户界面。 例如,我们可能有一个PHP控制器处理用户登录请求,这个控制器会使用模板引擎...

    详解AngularJS中ng-src指令的使用

    通过深入理解ng-src指令,我们能够更好地掌握AngularJS框架中数据绑定与DOM更新之间的交互方式,这对于开发高效、性能良好的Web应用程序是至关重要的。在实际项目中,正确使用ng-src等指令能够显著提高页面的响应性...

    通过angularjs的ng-repeat指令看scope的继承关系

    在AngularJS中,`ng-repeat`是一个非常重要的指令,它用于循环遍历数据集合,并将每个元素渲染到视图上。这个过程涉及到AngularJS的核心概念之一——Scope,它是应用程序中的数据模型,也是连接视图和控制器的桥梁。...

    angularjs+bootstrap html模板

    2. **指令**:AngularJS中的自定义HTML标签或属性,用于扩展HTML的功能,如`ng-if`、`ng-repeat`和`ng-click`。 3. **依赖注入**:AngularJS的DI系统使得服务、控制器、过滤器等组件之间可以轻松地共享和管理依赖,...

    AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法

    在这个指令中,`restrict: "A"`表示指令可以通过属性的方式使用,`templateUrl`指定了表格模板的路径,`transclude`配置是否允许内容插槽,`replace: true`则意味着指令元素将被模板替换。`controller`和`link`函数...

    angularJS+bootstrap模板

    **AngularJS + Bootstrap 模板详解** 在现代Web开发中,AngularJS和Bootstrap是两个非常重要的工具。AngularJS,由Google维护,是一个强大的JavaScript框架,主要用于构建动态单页应用程序(SPA)。而Bootstrap,则...

    AngularJS解决ng界面长表达式(ui-set)的方法分析

    首先,我们应当认识到,AngularJS框架使用的是MVC模式中的ViewModel来连接视图层和模型层。在这一层中,所有数据和函数都可以被HTML模板直接引用。当我们遇到一个深度嵌套的对象时,例如: ```javascript $scope....

    AngularJS 中文手册

    Directives 这些核心指令集可用于你的AngularJS应用的模板代码中。 例如:ngClick, ngInclude, ngRepeat… Services / Factories 这些核心服务集可通过依赖注入(DI)来供你的应用使用。 例如:$compile, $http, $...

    NG-Book 2 The Complete Book on AngularJS 2 r33 Code

    5. **模板语法**:AngularJS 2使用模板语法来声明数据绑定和指令,使HTML更具表现力。 6. **路由**:AngularJS 2的路由功能允许在单页面应用中根据URL导航到不同的视图,实现页面间的跳转。 7. **服务**:...

    angularjs指令 下拉框

    1. **定义指令**:在AngularJS应用中,使用`angular.module.directive()`来定义一个新的指令。例如: ```javascript angular.module('myApp').directive('customDropdown', function() { return { restrict: 'E'...

    AngularJS ng-model 指令

    `ng-model` 指令是 AngularJS 中的核心组件之一,它主要用于实现视图(View)和模型(Model)之间的绑定。这允许开发者在 HTML 控件(如 input、select 和 textarea)与 AngularJS 应用程序的数据之间建立直接的连接...

    AngularJs 2 中文权威教程(大部分已翻译),ng-book2中文版

    在阅读和学习过程中,配合"ng-book 2(The Complete Book On AngularJS 2) r41 含中文翻译"这份压缩包文件,可以更全面地理解AngularJS 2的各项特性和最佳实践。文件中的中文翻译使得国内开发者无需语言障碍,能更好...

    AngularJs ng-repeat必须注意的性能问题

    在AngularJS中,`ng-repeat`是一个非常常用且强大的指令,用于动态地渲染列表或集合中的数据。然而,如果不注意一些关键的性能问题,它可能会成为应用性能瓶颈。以下是对`ng-repeat`性能优化的详细分析和建议: 一...

    学习AngularJS-1.x.pdf

    * ng-template 指令:使用模板 十、AngularJS自定义Directive * 自定义Directive:如何创建自定义的Directive * Directive命名和使用规则 * 使用templateUrl获取模板 * 让Directive动起来:link()函数的使用 十一...

Global site tag (gtag.js) - Google Analytics