Angularjs系列之常用内置指令
2.4.1.常用内置指令常用内置指令有一些独特的性质。虽然可用表达式生成HTML代码从而与它们等效,但这些做法都是不推荐的。 ng-href 当使用当前作用域中的属性动态创建URL时,应该用ng-href代替href。Angular.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 Sharing,CORS)和同源规则(Same Origin Policy)来确保模板可以在任何浏览器中正常加载。例如,所有浏览器都不能进行跨域的请求,部分浏览器也不能访问file://协议的资源。 ng-switch 和ng-switch-when及on="propertyName"一起使用,可以在propertyName发生变化时渲染不同指令到视图中。 ng-if 根据表达式的值在DOM中生成或移除一个元素。同no-show和ng-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 将input、select、text area或自定义表单控件同包含它们的作用域中的属性进行绑定。它可以提供并处理表单验证功能,在元素上设置相关的CSS类(ng-valid、ng-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-even和ng-class-odd是AngularJS内置支持奇偶行不同外观的样式,内置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-show和ng-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头。"; }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |