zoukankan      html  css  js  c++  java
  • AngularJs学习笔记(四)

    1、AngularJs中的Module可以包含哪些组件?
    (1)value:保存可以在不同的controller之间共享的对象、数据
    (2)constant:保存可以在不同的controller之间共享的常量
    (3)service:保存可以在不同的controller之间共享的对象、数据、操作
    (4)filter:可以实现对数据的过滤和格式化,date、currency、limitTo.........
    (5)controller:控制器,用于设定模型数据-------每一个控制器实例都与一个$scope对象相链接-------注意:angular中的控制器不是单例的!每次使用都会创建一个新的对象(对应的$scope对象也是新创建的

    (6)directive:指令,用于封装DOM操作,扩展HTML标签及属性-----为HTML添加新标签、新的属性、新的样式
    2、关于模式
    23+1种模式:
    一种最简单的设计模式:单例模式------某个对象能够且仅能够创建一次

    JS中单例模式举例:

    //通过立即执行函数实现了JS中的单例模式
    (
             function (ename,age){
                        this.ename=ename;
                        this.age=age;
                        window.emp=this;//此处虽然污染了全局变量,但是使得外界可以访问这个对象
    }
    )('Tom',20);
    console.log(window.emp);
    //注:因为AngularJs中的controller可以反复创建,所以不是单例的

    验证controller不是单例的:

    html代码:

    <body ng-app="myModule">
            <h1>验证controller不是单例的</h1>
            <div ng-controller="myCtr1">我是第一个controller</div>
            <div ng-controller="myCtr2">我是第二个controller</div>
            <h3><b>结论:</b>若第一个输出为两个undefined,而第二个输出两个都是非undefined,则验证controller是非单例的(若是单例,则意味着myCtr1和myCtr2是同一个控制器,那么当第一次输出位undefined时,后面又赋值了,那第二次应该输出有值)</h3>
            <script src="js/angular.js"></script>
            <script src="js/9.js"></script>
    </body>

    对应的js代码:

    var mm=angular.module('myModule',[]);
    //声明第一个控制器
    mm.controller('myCtr1',function($scope){
        //此例中的this代表当前对象,即myCtr1
        console.log(this.uname+'   '+this.age);
        this.uname='Tom';
        this.age=20;
    });
    //声明第二个控制器
    mm.controller('myCtr2',function($scope){
        //这中的this代表myCtr2
        console.log(this.uname+'   '+this.age);
    });

    运行结果截屏:

    页面:

    console:

    验证service是单例的:

         结论:service,是module中的一种组件,专用于在不同的控制器对象间共享数据------任何一个service对象都是单例的-----只要一个service对象创建了,只要浏览器不关闭当前网页,此对象就一直存在---且只有这样一个对象!创建service的语法:

     moduleName.service('serviceName',function(){
                   this.xx=xxx;
                   this.y=function(){
    
                   };
           });

    验证的html代码:

    <body ng-app="myModule">
            <h1>验证service是单例的,请打开控制台查看结果</h1>
            <div ng-controller="myCtr1">我是第一个controller</div>
            <div ng-controller="myCtr2">我是第二个controller</div>
            <script src="js/angular.js"></script>
            <script src="js/10.js"></script>
    </body>

    验证的js代码:

    angular.module('myModule',[])
            //创建一个服务(注:service中的数据是不能直接在网页上显示,必须放在$scope中才可)
           .service('myService1',function(){
                   this.emp={};
           })
           .controller('myCtr1',function($scope,myService1){//将新创建的服务注入到controller中
                   console.log(myService1.uname+'  '+myService1.age);
                   myService1.uname='Tom';
                   myService1.age=20;
           })
           .controller('myCtr2',function($scope,myService1){
                   //虽然第一次输出为undefined,但是在第一controller中
                   //给服务又赋值了,因为其是单例的,所以在第二次输出时有值
                   console.log(myService1.uname+'  '+myService1.age);
           });

    页面截图:

    练习:创建两个Controller,第一个Controller中做一个双向绑定:<input ng-model="msg"/>,设法在第二个Controller的范围内,显示出前一个Controller中用户输入的msg  

    对应的html代码:

    <!DOCTYPE html>
    <html>
        <head>
            <title>AngularJs的练习</title>
            <meta charset="UTF-8"/>
        </head>
        <body ng-app="myModule">
            <div ng-controller="myCtr1">
                <label>请输入内容:</label><input ng-model="msg"/>
            </div>
            <p ng-controller="myCtr2">输入框中输入的内容是:{{ inputMsg }}</p>
            <script src="js/angular.js"></script>
            <script src="js/11.js"></script>
        </body>
    </html>

    对应的js代码:

    angular.module('myModule',[])
           .service('myService',function(){
                   //因为涉及到了不同的controller之间传递数据
                   //故采用service
                    this.message='';
           })
           .controller('myCtr1',function($scope,myService){
                   $scope.$watch('msg',function(newVal,oldVal){
                       //当用户输入内容发生变化时,就执行赋值语句,更新service
                       //中保存的数据
                       myService.message=newVal;
                   });
           })
           .controller('myCtr2',function($scope,$interval,myService){
                   $scope.inputMsg=myService.message;
                   //此处用定时器实现了,实时更新第二个controller中的mode数据
                   $interval(function(){
                       $scope.inputMsg=myService.message;
                   },10);
           });

    3、AngularJs中自定义过滤器
    js代码演示:-------此代码是弥补了原生的limitTo过滤器的不足,即可以超出限制加省略号

    angular.module('myModule',[])
            //自定义了一个过滤器
           .filter('myLimitTo',function(){
                   return function(txt,len){
                       var result=txt;
                       //对超出限制的文字加省略号
                       if(result.length>len){
                           result=result.slice(0,len)+'...';
                       }
                       return result;
                   }
           });

    对应的HTML中用法:

    <p>{{ 'hnhgfvvbb' | myLimitTo : 30 }}</p>

     4、自定义指令

       directive:指令,用于扩展HTML元素、属性、样式。定义新指令的语法:

           注:$watch不能监听service中的数据

    //指令是一个对象
    moduleName.directive('指令名',function(){
        return {
            //A:attribute,E:element,C:class,这三个可以任意组合
            //用于限制该指令在HTML中扮演的角色
            restrict:'AEC',
            template:'该指令实际对应的HTML内容',
            //当template中内容过多时,可以把内容写在一个单独的HTML文件中
            //用如下方式引入
            templateUrl:'xxx.html'
        }
    });

     练习:定制一个新的指令:nav-logo,只要使用该指令的地方,就会显示一个灰色的导航条以及一个logo图片

    注:以下代码不能本地打开,需要通过服务器才可运行成功

     对应的html:

    <!DOCTYPE html>
    <html>
        <head>
            <title>AngularJs的练习</title>
            <meta charset="UTF-8"/>
            <link rel="stylesheet" href="css/12.css"/>
        </head>
        <body ng-app="myModule">
            <!-- 将指令当标签用 -->
            <nav-logo></nav-logo>
            <!-- 将指令当属性用 -->
            <div nav-logo></div>
            <!-- 将指令当样式用(注:需要在指令中指定restrict:'C'才可实现) -->
            <!-- <div class="nav-logo"></div> -->
            <script src="js/angular.js"></script>
            <script src="js/12.js"></script>
        </body> 
    </html>

    对应的js代码:

    angular.module('myModule',[])
           //声明一个指令
           .directive('navLogo',function(){
                   return {
                       //restrict:'C', 不是必须的,但是若要将指令当做样式的话,必须写上
                      templateUrl:'directive/12.html'
                   }
           });

    对应的css:

    *{
        margin:0;
        padding:0;
    }
    .nav{
        height:60px;
        background:#afa;
    }
    .nav>img{
        width:60px;
        height:60px;
        margin-left:100px;
    }

    对应的模板html(此例中的12.html):

    <div class="nav">
        <img src="img/3.png"/>
    </div>

    效果截图:

  • 相关阅读:
    Adobe Acrobat XI pro v11.0.10中文版
    微软Office 2019 批量授权版21年04月更新版【福利】
    如何在PS里把证件照调正
    PS2020如何把图片中模糊不清的文字变清晰
    Office有效序列号大全
    计量经济学软件EViews11正式版【附激活文件】
    处理v-html的潜在XSS风险
    for 和 forEach 使用return,是跳出当前的循环,还是整个循环
    VUE防止多次点击,重复请求
    vue 分页插件使用
  • 原文地址:https://www.cnblogs.com/mujinxinian/p/5998993.html
Copyright © 2011-2022 走看看