美文网首页
angular的知识

angular的知识

作者: 小太阳会发光i | 来源:发表于2017-04-07 17:11 被阅读22次

    Angular:

    框架: 对程序员的限制高
    库:  jquery,bootstrap —— 使用灵活,对程序员的限制少
        它是MVC框架 精确定义是MVVM框架 mv*
        SPA (single page application) 移动端
    MVC:
    M:  Model           模型——数据
    V:  View            视图
    C:  Controller      控制器
    

    MVC 分离:

    1.数据、逻辑、 表现层代码的分离
    2.分工
    **学好:它最核心的核心的东西就是数据 
    
    以前写JS:存在大量的重复劳动
         window 事件 .....
    Angular:避免了重复劳动,让程序员更加关注需求的本质和实现。
    版本:
    官网:https://angularjs.org/
    混乱:
        1.2 以下
        1.3 以上  上课
        2.x 没人用  angular2   
        3.x 消失
        4.x 即将要出来
    

    基本用法:

    Angular指令:
    以 ng 开头。
    是否需要服务器环境——最好
    oninput是input值改变的时候触发
    1、ng-app
      angular管辖的范围
    2、ng-model
      数据,数据模型——  数据从哪来
    3、ng-bind
      数据绑定 —— 数据到哪去
    4、表达式{{a}}
      *Angular 和 原生的JS——不互通(事件、函数),可以解决。
    5、ng-click
      事件:  ng-mouseover  ....
      * 只关注数据
    6、ng-init
      数据初始化
    7、ng-repeat  循环 
      循环数组:
        ng-repeat="item in arr" 
            {{item}}  —— 数组中的每一项
      循环JSON:
        ng-repeat="(key,value) in json"
            {{key}} —— json中的key 
            {{value}} —— json中的value
    8、数组的索引:  $index  获取本元素的索引
      *在数组里,默认情况下不允许出现重复的数字 如果有重复的会报错
        track by  重新指定数组中的key
        以前:(key,value) in arr
        现在:item in arr track by $index
    9、过滤器   filter
       currency : 货币的filter
          参数: currency:'¥'
      date:
          date:'yyyy MM dd HH(hh) mm ss'
      放 | 后面
    

    Angular特性:

    1).双向绑定
        ng-bind:  不好 一开始清空内容
        *Angular——接管了 UI
        *Angular——扩展了html
    

    Angular:

    1、和原生的JS 是不互通 —— 可以得解决
    2、和传统的开发方式完全不同——只要盯住数据,数据是核心
    不互通:
      1)函数不互通
          Number 示例
      2)变量不互通
          全局变量示例
      3)事件不互通
    
    Angular:
    1)双向绑定
    2)依赖注入
    Controller:
    1)放代码
    2)原生和angular之间的桥梁 —— 在controller中可以使用原生代码
    *一个页面中,可以有多个模块
    *在一个模块中,可以有多个控制器
    *为什么不互通:因为angular的东西都在$scope身上。
    

    控制器: Controller

    1)定义模块 
        angular.module(模块名,所依赖的其它模块);
        let mod =  angular.module('mod1',[]);
    2)引用模块
        ng-app="模块名"
    3)定义Controller
        mod.controller('控制器名',回调函数($scope){ 
            //控制器的代码
        });
    4)引用controller
        ng-controller="ctr1"
    
    *所有的数据都放在$scope 
    
    $scope :  依赖项
    

    交互:

    1、文本框中输入图片地址,img标签加载图片  ![]({{a}})
    过程:
      浏览器看到img标签,试图去加载src里的图片文件 
      现在给的图片文件地址:  {{a}}
          —— 404 错
      Angular 出来了 —— 开始干活: 它认识: {{a}}
          —— 翻译成文本框中输入的真实的图片地址
    解决方案:
    ng-src
    
    因为:浏览器不认识 ng-src
    
    1、请求一个文本文件,内容显示到页面
       发现问题:
        jquery的ajax请求数据——正常
        请求回来的数据放到 $scope.arr —— 正常
        问题: 没有显示在页面
        因为:  angular 比较封闭,和其它框架、库配合不好。
    
    2、angular提供了自己的做数据交互的方式:
        $http —— 依赖项
        依赖项: $scope   $http
    
    用法:
        $http.get();
        $http.post();
        $http.jsonp();
    
      $http.get('请求地址').then(成功的回调,失败的回调);
    
      $http.get('a.txt').then(r=>{
          //r 就是成功后的返回对象  ***r完整的angular http返回对象
          // r.data 才是数据
      },err=>{
        //err 失败信息对象
      });
    
      ng-src    
      $http.get('接口/地址').then((r)=>{
        r//完整的对象
        //{data: Array[4], status: 200, config: Object, statusText: "OK"}
        r.data
      },(r)=>{
        console.log(r)
      })
        
    3、Promise
      回调函数 —— 恶梦 噩梦
      2015年,ES6——Promise
    
    1)用法——基本用法:
        resolve: 成功
        reject: 失败
        let pro = new Promise((resolve,reject)=>{
            $.ajax({
                url:'',
                dataType:'json',
                success:r=>{
                    resolve(r);
                },
                error:err=>{
                    reject(err);
                }
            });
        });
    
        pro.then(成功的回调,失败的回调);
        pro.then((r)=>{
            //r 成功后返回结果 ,处理成功的数据信息
        },(err)=>{
            //err  失败对象,处理失败信息
        });
    
    2)用法 —— 常规用法
        Promise.all();
        批量处理异步请求,统一处理成功的回调
        Promise.all([
            //请求1 的 Promise
            //请求2 的 Promise
        ]).then(成功回调,失败回调);
        全部成功才算成功,有一个失败就是整体失败。
    

    Promise

    1)基本用法,发一个请求
        new Promise((resolve,reject)=>{
            $.ajax({
                url:
                dataType:
                success(r){
                    resolve(r);
                },
                error(err){
                    reject(err);
                }
            });
        }).then((r)=>{
            //成功了
        },(e)=>{
            //失败了
        });
    
    2)Promise.all()
        Promise.all([
            //发请求的Promise对象
            new Promise(),
            new Promise(),
            ....
        ]).then(r=>{
            //以上数组中,指定的所有的请求,全部都成功,才是成功
        },err=>{
            //以上数组中,指定的所有的请求,只要有一个失败,就是失败
        });
    
    3)发现 jquery 的 $.ajax 返回值,返回一个Promise对象
        Promise.all([
            $.ajax({url:'1',dataType:'json'}),
            $.ajax({url:'2',dataType:'json'}),
            $.ajax({url:'3',dataType:'json'}),
        ]).then(r=>{
            //r : 数组,多次请求返回结果的数组
            //单独处理每次请求的结果
            let [arr1,arr2,arr3] = r;
            console.log(arr1); —— 第一个请求的返回值 
            ...
        },err=>{});
    4)
       Promise.race([
          $.ajax(),
          $.ajax()....
        ]).then(r=>{
            r —— 以上所有的请求,最快的那个
        },err=>{});
    

    怎么知道一个变量发生了改变?

    1.添加一个方法(set()) 设置变量的值 set 被调用时候 比较一下
    2.一般脏检查,将对象复制一份快照,在某个时间  比较现在对象与快照的值
           如果不一样就表明发生变化 这个策略要保留两份变量 而且要遍历对象
           比较属性 这样会有 一定性能问题
    3.它的策略
            1.不会脏检查所有对象  当对象被绑定到html中 这个对象添加为检查对象
            2.不会脏检查所有的属性,同样当属性被绑定后 这个属性会被列为检查的属性
            在它初始化时 会将绑定的对象的属性添加为监听对象 也就是说一个对象绑定N个属性
            就会添加N个watcher (意思是  绑定一个name属性 然后n个地方用  就会添加n个watcher);
    什么时候去脏检查
        angular所系统的方法中都会触发比较事件    
        比如:controller初始化的时候 所有ng-开头的事件执行后 都会触发脏检查
    

    不要在conroller中做以下事情

        1.不要在controller中做DOM操作  大大影响了应用逻辑的可测试性  可以把表现逻辑抽取到directive(指令中);
        2.输入格式化  使用angular form controls代替 (去看)
        3.输出格式化  使用angular filter 代替
        4.执行无状态或者有状态的、controller共享的代码  angular service(去看)代替
    

    在Angular 中使用 Promise:

    1、angular中,使用原生的 Promise,出问题了
      在then里处理数据的时候,$scope.nums = arr1 生效,但是页面无法使用
    2、angular 自己提供了一个  Promise, 
    新的依赖项:   $q 
    
    jQuery Ajax另几种写法:
      1、$.get('data/a.txt',{a:1},r=>{
            console.log(typeof r);
        });
        返回值是string类型
      2、$.post('data/a.txt',{a:1},r=>{
            console.log(typeof r);
        });
        返回值是string类型
      3、$.getJSON().....
        返回值是 json 对象
    Angular和其它库或原生的很多东西不通用:
    1) $.ajax           jquery
    2) Promise      原生   $q
    3)定时器
    原理:因为函数,在Angular中,它认为所有的东西都应该出现在自己的controller函数里,
                    对于其它地方回调函数里的值的处理,不认
    定时器:
    $interval
    $timeout
    解决以上问题的另外一个方法:
    $scope.$apply();
    ——通俗地说: 告诉、通知 Angular , 来看一下数据是不是变了
    

    一、模块化

    Angular中的模块化 —— 比较弱
    let mod = angular.module('mod',[]);
    例1:
        1) 在一个新的JS文件里定义了一个模块
            let mod1 = angular.module('mod1',[]);
            mod1.controller('mod1_ctr1',($scope)=>{
                $scope.a = 200;
            });
        2)在我的html文件中,自身的模块依赖于以上定义的模块: mod1
        3)在html文件中,可以同时使用自己的controlloer和模块中的controller:mod1_ctr1
    

    二、依赖注入

    把决定权交给消费者。
    函数参数:由调用者来决定 —— 被动的地位
        function show(a,b){
            alert(arguments.length);
        }
    Angular:函数的拯救者
    
    let mod = .....;
    mod.controller('ctr1',($scope,$q)=>{
        $scope.a=12;
    });
    想用谁,就把谁注入到函数。
    

    三、过滤器

    系统的过滤器: date  currency
        time|date:'yyyy-MM-dd'
        price|currency  —— $
            |currency:'¥' —— ¥
    要求:
        给定一个数字,显示一下是中文的星期几。
        let n = 3;
        {{n|cnDay}} —— 星期三
    
    自定义过滤器:
    angular.module('app',[])
    .filter('cnDay',function(){
        return function(input){
            //input 就是要处理的输入的数据
            //输入的数据——要对谁使用这个过滤器
            //对input进行处理
            return '返回值——就是最终要使用的内容';
        };
    });
    

    四、自定义指令

    指令: ng-bind ng-model....
      以ng-开头的都是系统提供的指令
    
    自定义一个指令:hehe-haha
    angular.module('myapp',[])
    .directive('heheHaha',()=>{
        return {
            template:'<span>欢迎你</span>'
        };
    })
    指令名称:
      驼峰命名法:  第一个字母小写,以后每个单词首字母大写
    限制选项:restrict —— 默认值 A E
    restrict:字符串
        A:  Attribute       属性
        E:  Element     元素
        C:  Class       类,样式中的class
        M:  coMment 注释 : 需要配合 replace:true
            ***M的时候  两边要留空格
    自定义指令中常用的几个选项:
    template:   输出的模板
    restrict:       限制、约束
        ECMA
    replace:        默认是false,
                    设置true,替换原有的标签

    相关文章

      网友评论

          本文标题:angular的知识

          本文链接:https://www.haomeiwen.com/subject/byvkottx.html