Angularjs系列之常用内置指令

2.4.1.常用内置指令

常用内置指令有一些独特的性质。虽然可用表达式生成HTML代码从而与它们等效,但这些做法都是不推荐的。

ng-href

当使用当前作用域中的属性动态创建URL时,应该用ng-href代替hrefAngular.js表达式可以设定大部分HTML元素的属性或者值,但单独设定锚链接的href属性是不可以的。这里的潜在问题是当用户点击一个由插值动态生成的链接时,如果插值尚未生效,将会跳转到错误的页面(通常是404)。

ng-src

ng-href同理,AngularJS会告诉浏览器在ng-src对应的表达式生效之前不要加载图像,因为生效之前加载的图片是无效的。

ng-disabled

使用ng-disabled可以把disabled属性绑定到各表单输入字段上。当写普通的HTML输入字段时,如果在元素标签上出现了disabled属性就会禁用这个输入字段。

ng-checked

标准的checked属性是一个布尔属性,不需要进行赋值。通过ng-checked将某个表达式同是否出现checked属性进行绑定。要与ng-model联合使用才有效果。

ng-readonly

同其他布尔属性一样,HTML定义只会检查readonly属性是否出现,而不是它的实际值。通过ng-readonly可以将某个返回真或假的表达式同是否出现readonly属性进行绑定:

ng-selected

可以对是否出现option标签的selected属性进行绑定。

ng-include

加载、编译并包含外部HTML片段到当前的应用中。模板的URL被限制在与应用文档相同的域和协议下,可以通过白名单或包装成被信任的值来突破限制。更进一步,需要考虑跨域资源共享(Cross-Origin Resource SharingCORS)和同源规则(Same Origin Policy)来确保模板可以在任何浏览器中正常加载。例如,所有浏览器都不能进行跨域的请求,部分浏览器也不能访问file://协议的资源

ng-switch

ng-switch-whenon="propertyName"一起使用,可以在propertyName发生变化时渲染不同指令到视图中。

ng-if

根据表达式的值在DOM中生成或移除一个元素。同no-showng-hide指令最本质的区别是,它不是通过CSS显示或隐藏DOM节点,而是真正生成或移除节点。

ng-repeat

遍历一个集合或为集合中的每个元素生成一个模板实例。集合中的每个元素都会被赋予自己的模板和作用域。同时每个模板实例的作用域中都会暴露一些特殊的属性。$index:遍历的进度(0... length-1)。$first:当元素是遍历的第一个时值为true$middle:当元素处于第一个和最后元素之间时值为true$last:当元素是遍历的最后一个时值为true$even:当$index值是偶数时值为true$odd:当$index值是奇数时值为true

ng-init

在指令被调用时设置内部作用域的初始状态。

ng-bind

尽管可以在视图中使用{{ }}模板语法(AngularJS内置的方式),我们也可以通过ng-bind指令实现同样的行为。内容会被当作子文本节点渲染到含有ng-bind指令的元素内。

ng-cloak

除使用ng-bind来避免未渲染元素闪烁,还可以在含有{{ }}的元素上使用ng-cloak指令。ng-cloak指令会将内部元素隐藏,直到路由调用对应的页面时才显示出来。

ng-bind-template

ng-bind指令类似,ng-bind-template用来在视图中绑定多个表达式。

ng-model

inputselecttext area或自定义表单控件同包含它们的作用域中的属性进行绑定。它可以提供并处理表单验证功能,在元素上设置相关的CSS类(ng-validng-invalid等),并负责在父表单中注册控件。

ng-show/ng-hide

根据所给表达式的值来显示或隐藏HTML元素。当赋值给ng-show指令的值为false时元素会被隐藏。类似地,当赋值给ng-hide指令的值为true时元素也会被隐藏。

ng-change

在表单输入发生变化时计算给定表达式的值。因为要处理表单输入,这个指令要和ngModel联合起来使用。

ng-form

在一个表单内部嵌套另一个表单。普通的HTML <form>标签不允许嵌套,但ng-form可以。内部所有的子表单都合法时,外部的表单才会合法。CSS类会根据表单的验证状态自动设置:表单合法时设置ng-valid;表单不合法时设置ng-invlid;表单未进行修改时设置ng-pristion;表单进行过修改时设置ng-dirty

Angular不会将表单提交到服务器,除非它指定了action属性。要指定提交表单时调用哪个JavaScript方法,使用下面两个指令中的一个。ng-submit:在表单元素上使用。ng-click:在第一个按钮或submit类型(input[type=submit])的输入字段上使用。

ng-click

指定一个元素被点击时调用的方法或表达式。

ng-select/ng-options

将数据同HTML<select>元素进行绑定。这个指令可以和ng-model以及ng-options指令一同使用,ng-options的值可以是一个内涵表达式(comprehension expression),它可以接受一个数组或对象,并对它们进行循环,将内部的内容提供给select标签内部的选项。数组作为数据源:用数组中的值做标签;用数组中的值作为选中的标签;用数组中的值做标签组;用数组中的值作为选中的标签组。对象作为数据源:用对象的键值(key-value)做标签;用对象的键值作为选中的标签;用对象的键值作为标签组;用对象的键值作为选中的标签组。

ng-class

style内不能使用angularjs表达式。使用ng-class动态设置元素的类,方法是绑定一个代表所有需要添加的类的表达式。重复的类不会添加。当表达式发生变化,先前添加的类会被移除,新类会被添加。ng-class-evenng-class-oddAngularJS内置支持奇偶行不同外观的样式,内置CSS样式名是.even.odd。代码范式:

ng-class="{CSS样式名:关系表达式,...}"

注意只有一个尖括号,不能不写尖括号,也不能写两个尖括号。

ng-style

把键值符合层叠样式表的对象赋给style

ng-submit

将表达式同onsubmit事件进行绑定。这个指令同时会阻止默认行为(发送请求并重新加载页面),除非表单不含有action属性。

ng-attr-(suffix)

AngularJS编译DOM时会查找花括号{{ some expression }}内的表达式。这些表达式会被自动注册到$watch服务中并更新到$digest循环中,成为它的一部分。有时浏览器会对属性会进行很苛刻的限制。SVG就是一个例子。

<svg>

<circle cx="{{ cx }}"></circle>

</svg>

运行上面的代码会抛出一个错误,指出我们有一个非法属性。可以用ng-attr-cx来解决这个问题。注意,cx位于这个名称的尾部。在这个属性中,通过用{{ }}来写表达式,达到前面提到的目的。

<svg>

<circle ng-attr-cx="{{ cx }}"><circle>

</svg>

示例工程:T91

HTML代码:

<!DOCTYPE html>

<html ng-app="myApp">

<head lang="en">

<metacharset="UTF-8">

<title>T91</title>

<scripttype="text/javascript" src="../vendor/angular.js"></script>

<scripttype="text/javascript" src="../controllers/hello.js"></script>

</head>

<body ng-controller="HelloController">

<h1 align="center">

AngularJS常用内置指令

</h1>

<table border="1px" cellspacing="0" cellpadding="5" rules="all" style="border:solid 1px #0000FF" width="100%" align="center">

<tr>

<tdwidth="25%" align="right">链接:</td>

<tdwidth="75%">

当锚链接的链接指向的是作用域的变量时,错误的用法:<a href="{{href1}}">我的博客</a></li>

正确的用法:<a ng-href="{{href2}}">我的博客</a>

</td>

</tr>

<tr>

<tdalign="right">图片:</td>

<tdvalign="center">

<divstyle="height: 64px;vertical-align: middle;line-height: 64px;float:left">这个后台报错:</div>

<imgstyle="float: left;" width="64px" height="64px" src="{{imgSrc1}}">

<divstyle="height: 64px;vertical-align: middle;line-height: 64px;float:left">,没问题的:</div>

<imgwidth="64px" height="64px" ng-src="{{imgSrc2}}">

</td>

</tr>

<tr>

<tdalign="right">启用与禁用:</td>

<td>

<buttonstyle="width:80px;height: 30px;" ng-click="onButton1Clicked(this)" ng-disabled="isButton1Disabled">{{button1Tip}}</button>

</td>

</tr>

<tr>

<tdalign="right">只读</td>

<td><textareastyle="width:98%" rows="5" ng-readonly="isTextarea1Readonly"></textarea></td>

</tr>

<tr>

<tdalign="right">复选框的值:</td>

<td><inputtype="checkbox"

value="再点我一下"

ng-init="checkbox1Value=true"

ng-model="checkbox1Value"

ng-checked="checkbox1Value"></td>

</tr>

<tr>

<tdalign="right">下拉列表框:</td>

<td>

<label>选中橘子:<input type="checkbox" ng-model="isSelectedSecond"></label>

<selectng-readonly="true" ng-disabled="true">

<option>苹果</option>

<optionng-selected="isSelectedSecond" >橘子</option>

<option>桃子</option>

</select>

</td>

</tr>

<tr>

<tdalign="right">包含网页:</td>

<td>

<divng-include="include.html" ng-controller="IncludeController" ng-init="name='李婷'">

你好,{{name}}

</div>

</td>

</tr>

<tr>

<tdalign="right">ng-switch</td>

<td>

<inputtype="text" ng-model="person1.name" style="float: left;"/>

<divng-switch on="person1.name" style="float: left;">

<spanng-switch-default>胜利者是:</span>

<spanng-switch-when="李婷">{{ person1.name }}</span>

</div>

</td>

</tr>

<tr>

<tdalign="right">ng-if</td>

<td>

<buttonstyle="float:left" ng-click="onNgif1Clicked()">增加</button>

<spanstyle="float:left">{{ngif1}}</span>

<divng-if="ngif1%2==0" style="float:left;color:blue">当数字是偶数的时候你才看得见我。</div>

</td>

</tr>

<tr>

<tdalign="right">ng-repeat</td>

<td>

<tablewidth="80%" border="0" cellpadding="0" cellspacing="0">

<tr>

<th>序号</th>

<th></th>

<th>第一个</th>

<th>中间</th>

<th>最后</th>

<th>偶数</th>

<th>奇数</th>

</tr>

<trng-repeat="ng in ngrepeat1">

<tdalign="center">{{$index}}</td>

<tdalign="center">{{ng}}</td>

<tdalign="center">{{$first}}</td>

<tdalign="center">{{$middle}}</td>

<tdalign="center">{{$last}}</td>

<tdalign="center">{{$even}}</td>

<tdalign="center">{{$odd}}</td>

</tr>

</table>

</td>

</tr>

<tr>

<tdalign="right">ng-init</td>

<td><png-init="nginit1='你好,我在HTML中初始化的'">{{nginit1}}</p></td>

</tr>

<tr>

<tdalign="right">ng-bind</td>

<td><png-bind="ngbind1"></p></td>

</tr>

<tr>

<tdalign="right">ng-cloak</td>

<td><png-cloak>{{ngcloak1}}</p></td>

</tr>

<tr>

<tdalign="right">ng-bind-template</td>

<td><png-bind-template="{{ngtemplate1}}{{ngtemplate2}}"></p></td>

</tr>

<tr>

<tdalign="right">ng-show/ng-hide</td>

<td>

<spanng-show="ngshow1">你好</span><button ng-click="onNgshow1Clicked()" style="width:80px;height: 30px;">切换</button>

<spanng-hide="nghide1">ng-showng-hide</span><button ng-click="onNghide1Clicked()" style="width:80px;height: 30px;">显隐</button>

</td>

</tr>

<tr>

<tdalign="right">ng-options1</td>

<td><div>

<selectng-model="options1"

ng-options="options1.namefor options1 in ngoptions1">

<optionvalue="">选择一个城市</option>

</select>

你最喜欢的城市: {{ options1.name }}

</div></td>

</tr>

<tr>

<tdalign="right">ng-attr-(stuff)</td>

<td>

<table>

<tr><td>

<svgwidth="300" height="100" version="1.1" >

<circlecx="{{ngstuff1}}" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />

</svg>

</td><td>

<svgwidth="300" height="100" version="1.1" >

<circleng-attr-cx="{{ngstuff1}}" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />

</svg>

</td></tr>

</table>

</td>

</tr>

</table>

</body>

</html>

JS代码:

var module=angular.module("myApp",[]);

module.controller("HelloController",function($scope,$timeout){

$scope.button1Tip="点我试试";

$scope.isButton1Disabled=false;

$scope.isTextarea1Readonly=false;

$scope.checkbox1Value=false;

$scope.isSelectedSecond=false;

$scope.person1={

name:""

};

$scope.ngif1=1;

$scope.onButton1Clicked=function(dom){

$scope.href1="http://blog.csdn.net/caoshiying?viewmode=contents";

$scope.href2=$scope.href1;

$scope.imgSrc1="../images/ghl.jpg";

$scope.imgSrc2=$scope.imgSrc1;

console.log("已设置链接。");

$scope.isButton1Disabled=true;

$scope.isTextarea1Readonly=true;

$scope.button1Tip="不理你。";

};

$scope.$watch("checkbox1Value",function(){

console.log("复选框的值:"+$scope.checkbox1Value);

});

$scope.onNgif1Clicked=function(){

$scope.ngif1+=1;

};

$scope.ngrepeat1=["","","","",""];

$scope.ngbind1="我可以赋值为InnerHTML";

$scope.ngcloak1="我在路由调用的时候显示的。"

$scope.ngtemplate1="你好,";

$scope.ngtemplate2="世界,template bind";

$scope.ngshow1=true;

$scope.nghide1=true;

$scope.onNgshow1Clicked=function(){

$scope.ngshow1=!$scope.ngshow1;

};

$scope.onNghide1Clicked=function(){

$scope.nghide1=!$scope.nghide1;

}

$scope.ngoptions1= [

{name:'Seattle'},

{name:'San Francisco'},

{name:'Chicago'},

{name:'New York'},

{name:'Boston'}

];

$scope.options1={};

$scope.ngstuff1=64;

});

module.controller("IncludeController",function($scope){

$scope.hello="我是另外一个网页。有标准的HTML头。";

});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中文文档更容易理解,前提是你的英语基础还可以。英文文档对于知识点讲述简明扼要,通俗易懂,而有些中文文档读起来特别费力,基础差、底子薄的有可能一会就会被绕晕了,最起码英文文档中的代码与中文文档中的代码是一致的,但知识点讲述实在是差距太大。Angular.jshasapowerfuldire
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是一个令人印象深刻的 JavaScript 图表库,建立在 HTML5 Canvas 基础上。目前,它支持6种图表类型(折线图,条形图,雷达图,饼图,柱状图和极地区域区)。而且,这是一个独立的包,不依赖第三方 JavaScript 库,小于 5KB。   其中用到的软件:   Chart.js框架,版本1.0.2,一
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,结局方案为更换jquery、angularjs、IE的版本。 1.首先尝试更换jquery版本为1.7.2 jquery-1.9.1.js-->jquery-1.7.2.js--> jquery2.1.4.js 无效 2.尝试更换IE版本IE8 IE11-
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:http://ngmodules.org/modules/angularjs-dropdown-multiselecthttp://dotansimha.github.io/angularjs-dropdown-multiselect/#/AngularJSDropdownMultiselectThisdire
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方服务。软件首页截图如下所示: 涉及的源代码如下所示: //语音识别$rootScope.startRecognize = function() {var speech;
Angular数据更新不及时问题探讨前言 在修复控制角标正确变化过程中,发觉前端代码组织层次出现了严重问题。传递和共享数据时自己使用的是rootScope,为此造成了全局变量空间的污染。根据《AngularJs深度剖析与最佳实践》,如果两个控制器的协作存在大量的数据共享和交互可以利用Factory等服务的“单例”特性为它们注入一个共享对象来传递数据。而自己在使用rootScope
HTML:让表单、文本框只读,不可编辑的方法有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使中国">的内容,"中国"两个字不可以修改。实现的方式归纳一下,有如下几种。方法1:onfocus=this.blur()中国"onfocus=this.blur()>方法2:readonly中国"readonly>中国"readonly="tru
在AngularJS应用中实现微信认证授权遇到的坑前言 项目开发过程中,移动端新近增加了一个功能“微信授权登录”,由于自己不是负责移动端开发的,但最后他人负责的部分未达到预期效果。不能准确实现微信授权登录。最后还得靠自己做进一步的优化工作,谁让自己是负责人呢?原来负责人就是负责最后把所有的BUG解决掉。 首先,熟悉一下微信授权部分的源代码,如下所示:
AngularJS实现二维码信息的集成思路需求 实现生成的二维码包含订单详情信息。思路获取的内容数据如下: 现在可以获取到第一级数据,第二级数据data获取不到。利用第一级数据的获取方法获取不到第二级数据。for(i in data){alert(i); //获得属性 if(typeof(data[i]) == "o
Cookie'data'possiblynotsetoroverflowedbecauseitwastoolarge(5287>4096bytes)!故事起源 项目开发过程中遇到以上问题,刚开始以为只是个警告,没太在意。后来发现直接影响到了程序的执行效果。果断寻找解决方法。问题分析 根据Chrome浏览器信息定位,显示以下代码存在错误:
AngularJS控制器controller之间如何通信angular控制器通信的方式有三种:1,利用作用域继承的方式。即子控制器继承父控制器中的内容2,基于事件的方式。即$on,$emit,$boardcast这三种方式3,服务方式。写一个服务的单例然后通过注入来使用利用作用域的继承方式由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值
AngularJS路由问题解决遇到了一个棘手的问题:点击优惠详情时总是跳转到药店详情页面中去。再加一层地址解决了,但是后来发现问题还是来了:Couldnotresolve'yhDtlMaintain/yhdetail'fromstate'yhMaintain'药店详情http://192.168.1.118:8088/lmapp/index.html#/0优惠券详情
书海拾贝之特殊的ng-src和ng-href在说明这两个指令的特殊之前,需要先了解一下ng的启动及执行过程,如下:1)浏览器加载静态HTML文件并解析为DOM;2)浏览器加载angular.js文件;3)angular监听DOMContentLoaded事件,监听到时开始启动;4)angular寻找ng-app指令,确定作用范围;
angularjs实现页面跳转并进行参数传递Angular页面传参有多种办法,我在此列举4种最常见的:1.基于ui-router的页面跳转传参(1)在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个producers,点击其中一个目标,页面跳转到对应的producer页,同时将producerId
AngularJS实现表格数据的编辑,更新和删除效果实现首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据var app = angular.module('plunker', ['ui.bootstrap']);app.controller('MainCtrl', function($scope) { $scope.name = 'World'; $sc
ANGULAR三宗罪之版本陷阱      坑!碰到个大坑,前面由于绑定日期时将angular版本换为angular-1.3.0-beta.1时,后来午睡后,登录系统,发现无论如何都登陆不进去了,经过调试,发现数据视图已经无法实现双向绑定了。自己还以为又碰到了“僵尸程序”了呢,对比药店端的程序发现并没有什么不同之处。后来自己经过一番思索才隐约感觉到是不是angular的版本造成的,将版本换为之前
JS实现分页操作前言 项目开发过程中,进行查询操作时有可能会检索出大量的满足条件的查询结果。在一页中显示全部查询结果会降低用户的体验感,故需要实现分页显示效果。受前面“JS实现时间选择插件”的启发,自己首先需要查看一下HTML5能否实现此效果。 整了半天,不管是用纯CSS3也好,还是用tmpagination.js还是bootstrap组件也好,到最后自己静下心来理
浏览器兼容性解决之道前言 浏览器兼容性一直是前端开发中不得不面对的一个问题。而最突出的就是IE。对绝大多数公司来说,兼容IE6的性价比已经很低,而IE7则几乎已经绝迹。所以,常见的兼容性下限是IE8。这也正是Angular1.2x的兼容性目标,Angular团队声明:Angular的持续集成服务器会在IE8下运行所有的测试。但这些测试不会运行在IE7及以下版本,它们也不会保证An
JS利用正则表达式校验手机号绪 由于项目需求,需要在前端实现手机号码的校验。当然了,对于基本的格式校验应该放在客户端进行,而不需要再将待校验的手机号发送至服务端,在服务端完成校验,然后将校验结果返回给客户端,客户端根据返回的结果再进行进一步的处理。如此反而复杂化了处理过程。 其实,处于安全考虑,应该在服务端进行二次校验。以下为在客户端的JS中校验手机号码格式
基于项目实例解析ng启动加载过程前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理。回过头来总结一下angular的启动过程。 下面以实际项目为例进行简要讲解。1.载入ng库2.等待,直到DOM树构造完毕。3.发现ng-app,自动进入启动引导阶段。4.根据ng-app名称找到相应的路由。5.加载默认地址。6.Js顺序执行,加载相应模版页sys_tpls/