angular的知识

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,替换原有的标签
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容