zoukankan      html  css  js  c++  java
  • AngularJS学习笔记(四)内置指令

    说说指令

    不得不赞叹,指令是ng最为强大的功能之一,好吧,也可以去掉之一,是最强大的功能。ng内置了许多自定义的指令,这避免了我们自己去造轮子。同时,ng也提供了自定义指令的功能,可以让我们的页面元素标签更加实例化。

    内置的指令很多,至少40-50个吧。我们在学习的时候,有两种思路,一种是先作题,遇到不会的就去问;还有一种就是先把书都看了,然后再做题。这儿呢,我们就先介绍大概的类别,至于细节指令,我们线下自我修行吧。

    1.必须要会的指令

    (1)ng-app

    一个页面仅能有第一个ng-app起作用,所以页面最好是将ng-app写到html根元素上,这样所有的元素就都归ng管啦。

    (2)ng-controller

    一个页面可以有多个ng-controller,有一个Controller,也就意味着多了一个隔离区域。一般来说,Controller负责通过服务进行CRUD操作,并将数据或结果绑定在Controller的$scope上。

    (3)ng-model

    我们在上一篇也见过这个指令,<input type=’textbox’ ng-model=’name’ />,此处的含义是:将Controller中$scope的name绑定到此元素上,如果此元素内容变化,则必然会修改$scope.name的值

    (4){{}}和ng-bind

    这俩指令功能类似,都是将Controller中$scope上的值(例如name)绑定到显示元素上的。

    两者的区别是:如果使用{{}},页面在加载的瞬间,用户有可能会看到尚未绑定数据的源码状态,而ng-bind则不存在此问题。不过不必因此困扰,用哪个都可以,也就是那么一瞬间吗。

         hello,{{name}}
         <hr>
         hello,<span ng-bind='name'></span>

    2.样式相关的指令

    (1)ng-class

    ng-class可以设置为{key:value}对象,当value为真时,key所对应的样式启作用。

    <!DOCTYPE html>
    
    <html ng-app="App">
    <head>
        <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/394/xjz9g1bv/angular.js"></script>
        <script type="text/javascript">
    
            var App = angular.module("App", []);
    
            App.controller("ctrl", function ($scope) {
                
                $scope.isbk=false;
                $scope.isft=false;
                
            });
            
        </script>
        <style type='text/css'>
          .bkcolor
            {
                background-color:green;
            }
            
            .ftcolor
            {
                color:red;
            }
        </style>
    </head>
        <body>
            <div ng-controller ="ctrl">
                <input type='checkbox' ng-model='isbk' />使用background
                <input type='checkbox' ng-model='isft'/>使用frontcolor
                <div ng-class='{bkcolor:isbk, ftcolor:isft}'>
                    测试
                  </div>
            </div>
        </body>
    </html>

    查看效果:

    jdfw1

    点击这里测试运行效果。

    (2)ng-class-even,ng-class-odd

    这两个指令和ng-class类似,不过特殊之处是需要配合ng-repeat使用,代码如下:

    <!DOCTYPE html>
    
    <html ng-app="App">
    <head>
        <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/394/xjz9g1bv/angular.js"></script>
        <script type="text/javascript">
    
        var App = angular.module("App", []);
    
        App.controller("ctrl", function ($scope) {
                
                $scope.personList = [{
                    name:"张三",
                    age:30
                },{
                    name:"李四",
                    age:40
                },{
                    name:"王五",
                    age:50
                }];
    
                
            });
            
        </script>
        <style type='text/css'>
          .oddcolor
            {
                background-color:green;
            }
            
            .evencolor
            {
                background-color:red;
            }
        </style>
    </head>
        <body>
            <div ng-controller ="ctrl">
                <table>
                    <tr ng-repeat='person in personList' >
                        <td>{{$index}}</td>
                        <!--注意:此处为字符串-->
                        <td ng-class-odd="'oddcolor'" ng-class-even="'evencolor'">{{person.name}}</td>
                        <td ng-class-odd="'oddcolor'" ng-class-even="'evencolor'">{{person.age}}</td>
                    </tr>
                </table>
            </div>
        </body>
    </html>

    显示效果:

    image

    点击这里查看效果。

    (3)ng-style

    只需给ng-style赋值给style的对象就ok,见代码:

    <!DOCTYPE html>
    
    <html ng-app="App">
    <head>
        <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/394/xjz9g1bv/angular.js"></script>
        <script type="text/javascript">
    
        var App = angular.module("App", []);
    
        App.controller("ctrl", function ($scope) {
                
                $scope.style={color:'red'};
                
            });
            
        </script>
    </head>
        <body>
            <div ng-controller ="ctrl">
                <div ng-style='style'>
                    测试
                </div>
            </div>
        </body>
    </html>

    效果:

    image

    点击这里查看效果。

    (4)ng-show/ng-hide

    这是两个常用的指令,对应的值为true或false。当为true的时候,对应的指令生效,对应的css是display: block和display:none。

    <!DOCTYPE html>
    
    <html ng-app="App">
    <head>
        <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/394/xjz9g1bv/angular.js"></script>
        <script type="text/javascript">
    
        var App = angular.module("App", []);
    
        App.controller("ctrl", function ($scope) {
                
                $scope.isshow = false;
                
            });
            
        </script>
    </head>
        <body>
            <div ng-controller ="ctrl">
                <input type="checkbox" ng-model="isshow"/>显示
                <div ng-show="isshow">
                    显示的内容。
                </div>
            </div>
        </body>
    </html>

    运行效果:

    jdfw2

    点击这里查看效果。

    3.表单指令

    既然是表单指令,自然是指input、select、form等指令,还包括一些表单元素的状态指令。下面这个例子介绍一个登陆窗口,当用户名或密码为空时进行提示,并登录按钮不可用。

    这其中要用到input指令和form指令,我们需要参考AngularJS的API使用这些指令的属性,下面来看例子吧。

    <!DOCTYPE html>
    
    <html ng-app="App">
    <head>
        <link rel="stylesheet" type="text/css" href="http://sandbox.runjs.cn/uploads/rs/394/xjz9g1bv/bootstrap.css">
        <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/394/xjz9g1bv/angular.js"></script>
        <script type="text/javascript">
    
            var App = angular.module("App", []);
    
            App.controller("ctrl", function ($scope) {
    
                $scope.loginInfo = {
                    name: "",
                    pwd: ""
                };
    
                $scope.login = function () {
                    alert("登陆名:" + $scope.loginInfo.name + "
    登陆密码:" + $scope.loginInfo.pwd + "
    执行登陆验证!");
                }
    
            });
        </script>
    </head>
        <body style='padding-top:10px;'>
            <div class='container' ng-controller="ctrl">
            <!--form需有name属性-->
            <form name='loginform' class="form-horizontal">
                <div ng-class="{'form-group':true,'has-success':loginform.username.$valid,'has-error':!loginform.username.$valid}">
                    <label class='col-md-2 control-label'>登陆名:</label>
                    <div class='col-md-7'>
                        <!--input元素需有name属性,注意:name属性和ng-model绑定 -->
                        <!--此处使用了 required、minlength、maxlength属性 -->
                        <input type="text" class="form-control" name='username' ng-model='loginInfo.name' required ng-minlength="3" ng-maxlength="10">
                    </div>
                    <!--注意:此处使用的是form的name属性和input元素的name属性 -->
                    <label class='col-md-3 control-label'>
                        <span ng-show='loginform.username.$error.required'>
                            登陆名不能为空。
                        </span>
                        <span ng-show="loginform.username.$error.minlength">
                            登录名不能小于3个字符
                        </span>
                        <span ng-show="loginform.username.$error.maxlength">
                            登录名不能大于10个字符
                        </span>
                    </label>
                </div>
                <div ng-class="{'form-group':true,'has-success':loginform.userpwd.$valid,'has-error':!loginform.userpwd.$valid}">
                    <label class='col-md-2 control-label'>密码:</label>
                    <div class='col-md-7'>
                        <input type="password" class="form-control" name='userpwd' ng-model='loginInfo.pwd' required>
                    </div>
                    <label class='col-md-3 control-label' ng-show="loginform.userpwd.$error.required">
                        密码不能为空。
                    </label>
                </div>
                <div class="form-group">
                    <div class='col-md-offset-2 col-md-10'>
                        <!--注意:此处使用ng-submit和ng-disabled-->
                        <input type="submit" class='btn btn-primary' value="登录" ng-click="login();" ng-disabled="!loginform.$valid" />
                        <button class='btn btn-danger'>
                            取消
                        </button>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        loginform.username.$valid = {{loginform.username.$valid}}
                    </div>
                    <div class="col-md-offset-2 col-md-10">
                        loginform.username.$error = {{loginform.username.$error}}
                    </div>
                    <div class="col-md-offset-2 col-md-10">
                        loginform.$valid = {{loginform.$valid}}
                    </div>
                    <div class="col-md-offset-2 col-md-10">
                        loginform.$error = {{loginform.$error}}
                    </div>
                </div>
            </form>
        </div>
        </body>
    </html>

    看看效果:

    jdfw4

    点击这里查看效果。表单指令较多,此处简单介绍一般常用指令,深入的和其他的让我们线下自己学习吧。

    4.逻辑指令

    (1)ng-repeat

    ngRepeat指令为集合中的每项实例化一个模板。每个模板的实例拥有自己的域,使用循环变量指向当前集合项上,$index指向当前项的索引或键值。它有一些常用的属性:$index、$first、$middle、$last、$odd、$even。

    <!DOCTYPE html>
    
    <html ng-app="App">
    <head>
        <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/394/xjz9g1bv/angular.js"></script>
        <script type="text/javascript">
    
        var App = angular.module("App", []);
    
        App.controller("ctrl", function ($scope) {
                
                $scope.personList = [{
                    name:"张三",
                    age:30
                },{
                    name:"李四",
                    age:40
                },{
                    name:"王五",
                    age:50
                }];
                
            });
        </script>
        
    </head>
        <body>
            <div ng-controller ="ctrl">
                <ul>
                    <li ng-repeat='person in personList'>
                        姓名:{{person.name}},年龄:<span ng-bind='person.age'></span>
                    </li>
                </ul>
            </div>
        </body>
    </html>

    运行效果:

    image

    点击这里查看。

    (2)ng-if

    ngIf指令基于{表达式}来移除或重建DOM树的一部分。如果赋给 ngIf的表达式计算结果为假,元素会从DOM移除,其它情况会复制一份元素插入到DOM中。

    查看效果:

    jdfw

    点击这里查看效果。

    乍一看,这效果和上面那个ng-show和ng-hide有点相似么。确实,从图片效果看,却是如此,但是ng-show和ng-hide只是将display属性设置为block或null,而ng-if则是将该dom元素移除或增加上的,具体看下图:

    jdfw

    (3)ng-switch

    ngSwitch指令用于根据域表达式在你的模板上按条件切换DOM结构。

    查看代码:

    <!DOCTYPE html>
    
    <html ng-app="App">
    <head>
        <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/394/xjz9g1bv/angular.js"></script>
        <script type="text/javascript">
    
        var App = angular.module("App", []);
    
        App.controller("ctrl", function ($scope) {
                
                  $scope.switchValue = 1;
            });
            
        </script>
    </head>
        <body>
            <div ng-controller ="ctrl">
                <input type='radio' value='1' ng-model='switchValue' />1
                <input type='radio' value='2' ng-model='switchValue' />2
                <input type='radio' value='3' ng-model='switchValue' />3
                <input type='radio' value='4' ng-model='switchValue' />4
                <div>
                    选择的值 {{switchValue}}
                </div>
                <div ng-switch="switchValue">
                    <div ng-switch-when='1'>
                        我的值是1
                    </div>
                    <div ng-switch-when='2'>
                        我的值是2
                    </div>
                    <div ng-switch-when='3'>
                        我的值是3
                    </div>
                    <div ng-switch-default>
                        我是default
                    </div>
                </div>
            </div>
        </body>
    </html>

    查看效果:

    jdfw

    在上图,我们也可以看到,随着选择值的不同,ng-switch也在不停的增删dom。点击这里查看效果。

    5.事件指令

    事件指令也是一个大家族呀,常用的有这些呀:ng-change、ng-dblclick、ng-mousedown、ng-mouseenter、ng-mouseleave、ng-mousemove、ng-mouseover、ng-mouseup、ng-submit啊。

    不过只是对常用的事件做了封装,很好使用,上面的例子中用到了ng-click,小伙伴,你可get到了,这儿就不写例子啦。

    小结

    指令的内容真的非常多,非常多,这篇文章看到这儿,你应该已经大致了解了内置指令的应用,像开头说的,以后你用到哪个指令,就好好的学习哪个指令吧。

  • 相关阅读:
    jQuery检测滚动条(scroll)是否到达底部
    sql group by
    hbm.xml 详解总结
    net.sf.json 时间格式的转化
    经典SQL语句大全
    HashTable
    in与exist , not in与not exist 的区别
    网页布局常用的一些命名规则和书写
    什么是SOA?
    sql之left join、right join、inner join的区别
  • 原文地址:https://www.cnblogs.com/oneword/p/5836463.html
Copyright © 2011-2022 走看看