当前位置 博文首页 > weixin_33701564的博客:AngularJS进阶学习

    weixin_33701564的博客:AngularJS进阶学习

    作者:[db:作者] 时间:2021-07-09 22:07

    参考:http://***/class/54f3ba65e564e50cfccbad4b

    1. AJAX:Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)可以与服务器交换数据并更新部分网页,而无需重新加载整个页面。

    2. JQuery:浏览器里原生的JavaScript有点像汇编语言,不同的浏览器就像不同的CPU架构,汇编语言各有千秋,这让前端开发者很恼火。聪明人很快发现了这个痛点,于是,抹平浏览器差异的jQuery库出现了。

    3. AngularJS:jQuery看成库的话,AngularJS则是一个框架,它以一种特殊的方式向jQuery表达了敬意:内置精简版的jQuery - jqLite。如果某种原因你不愿意使用jqLite,也可以在AngularJS之前引入jQuery库。 AngularJS自动地将jqLite升级成jQuery。

    ?

    指令directive:类似ng-app,ez-clock这样的非标准HTML标签叫做指令(JavaScript文件)

    模板:包含AngularJS标记的html文件被称为模板

    编译:将指令解析成为浏览器可以理解的html元素和脚本的过程叫做编译

    视图:通过编译器解析处理模板文件,生成的结果就是视图

    一般过程:构造声明式界面模板,来提出需求,继而抽取并实现自定义指令。

    1. 作用域/Scope

    在HTML模板中,我们用了两个内置指令:

    • ng-app指令会在启动引导时创建一个$rootScope对象。
    • ng-init指令用来在作用域上初始化变量,这个指令将在$rootScope上建立sb对象。

    1.1 层级的作用域

    在默认情况下,一个DOM子元素不会创建新的作用域,也就是说,这个子元素所对应的 scope对象,其实就是它的最近一级的祖先对象对应的scope对象。

    有些指令会导致创建新的作用域,比如ng-controller。如果在一个DOM对象上创建了新 的作用域,那么这个scope对象的原型是其最近一级的组件对象的scope对象。

    1.2 监听Scope数据的变化

    编译仅仅在启动引导时执行一次,这意味着我们的link函数只会被调用一次,所以需要监听数据变化来使得界面和数据一致。

    
     
    1. $watch(watchExpression, listener, [objectEquality]);

    $watch方法要求传入三个参数:

    • watchExpression - 要监听的表达式,比如:"sb"
    • listener - 变化发生时的回调函数,AngularJS将向这个函数传入新值和旧值
    • objectEquality - 如果监听表达式的值是一个对象,应当将这个参数置为true。

    以上便建立了从 数据到界面的单向绑定

    1.3 修改Scope上的数据

    挂接监听函数(示例中使用keyup事件), 在监听函数中实现对sb变量的修改。

    以上便建立了从 界面到数据的单向绑定

    angular.module("ezstuff",[])
    .directive("ezNamecardEditor",function(){
        return {
            restrict : "E",
            template : "<ul class='nceditor'></ul>",
            replace : true,
            link : function(scope,element,attrs){
                //获得变量名称
                var model = attrs.data;
    
                //展开HTML模板,使用field属性标记对应字段
                element.append("<li>name : <input type='text' field='name'></li>")
                    .append("<li>gender : <input type='text' field='gender'></li>")
                    .append("<li>age : <input type='text' field='age'></li>");
    
                //监听DOM事件,变化时修改变量值
                element.find("input").on("keyup",function(ev){
                    var field = ev.target.getAttribute("field");
                    scope[model][field] = ev.target.value;
                    //将对scope的修改进行传播
                    scope.$apply("");
                });
            }
        };
    })
    .directive("ezLogger",function(){
        return {
            restrict : "A",
            link : function(scope,element,attrs){
                var model = attrs.data;
    
                scope.$watch(model,function(nv){
                    var cnt = JSON.stringify(nv,null,"    ");
                    element.html("<pre>"+cnt+"</pre    ");
                },true);
            }
        };
    });
    cs