angular笔记二

angular第二天

羊群效应
依赖注入
复习

对象与对象之间是不会出现相同的,
localStroage,复习;
localStroage.clear()清除
localStroage.BDSUGSTORED,查看页面缓存,例如百度搜索的页面,大小是4M;
track by,在遍历时记得加上
src直接请求,angular处理是加ng-src,等待angular加载,就不会出现百分号;
MVVM设计模式

  • 模块

创建模块

    <body>
    <script src=""></scripe>
<script>
//创建模块
//(var app=angular.module('myApp',[])();自执行函数需要用到寻找模块来寻找对应的模块;
    var app=angular.module('myApp',[]);
    var app2=angular.module('myApp',[]);
    //即便名字相同,也是FALSE滴;即app比较app2为FALSE;
    //寻找模块,通过模块的名字
    var app3=angular.module('myApp');//在操作的时候需要将app2先注释;
</scripe>
    </body>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<!--只能有一个ng-app-->
<body ng-app="myApp1" ng-controller="myCtrl1">
    {{text}}
    <div ng-controller="myCtrl2">
        {{text}}
    </div>
    <!--引入angular-->
    <script src="./angular-1.5.8/angular.js"></script>
    <script>
    //将myApp2存放到app1的注入数组中,
        var app1=angular.module('myApp1',['myApp2']);
        app1.controller('myCtrl1',function($scope){
            $scope.text="1";
        });
        var app2=angular.module('myApp2',[]);
        app2.controller('myCtrl2',function($scope){
            $scope.text="2";
        });
    </script>
</body>
</html>

ng-app需要用到就近原则,它也是需要费时间去找ng-app的;哪里需要用哪里
主模块和子模块,控制器名字不同,模块名字不同,主模块引入子模块
页面中ng-app只能有一个,控制器可以多个
angular会将页面滴东西加载一遍,如果没有使用控制器时,子模块不会被调用,同时子模块放在主模块是一个字符串来滴
主模块和子模块名字不要一样

3.不常用的方法

      <div id="my1" ng-controller="myCtrl2">
        {{text}}
    </div>
      <div id="my2" ng-controller="myCtrl2">
        {{text}}
    </div>
        <!--引入angular-->
<script src="./angular-1.5.8/angular.js"></script>
    <script>
    //将myApp2存放到app1的注入数组中,
        var app1=angular.module('myApp1',['myApp2']);
        app1.controller('myCtrl1',function($scope){
            $scope.text="1";
        });
        var app2=angular.module('myApp2',[]);
        app2.controller('myCtrl2',function($scope){
            $scope.text="2";
        });
 angular.bootstrap(document.getElementById('my1'),['myApp1']);
  angular.bootstrap(document.getElementById('my2'),['myApp2']);
</script>

不常用模块使用
ng-app可以多次使用
angular.bootstrap()手动注册ng-app
寻找ng-app,没有就可以使用angular.bootstrap手动注册,可以使用这个分段加载模块,用的相对少,作为了解
常用模块使用
主模块与配合子模块使用

  • 控制器的使用
    **这段代码未完善**

多个控制器使用

<body>
    <div ng-app="myApp" ng-init=" text='hello'">
        {{text}}
        <div ng-controller="myCtrl">
            {{text}}
            <div ng-controller="myCtrl2">
                {{text}}
            </div>
        </div>
        <div  ng-controller="myCtrl3">
            {{text}}
        </div>
    </div>

<script src="js/angular.js"></script>
<script>
    //1. ngController只能放在ngApp中使用
    // 2. 会有多个controller一起使用,controller的使用采用就近原则来使用controller
    //3. $scope会有一个类似继承的关系,每一个主模块的页面中都会有一个$roorScope(主作用域),所有的控制器都会创建自己的scope(子作用域)
    // 4. $scope中没有的变量会去上一级scope寻找直到$rootScope终止
    var app=angular.module('myApp',[]);
    app.controller('myCtrl',function ($scope) {
       $scope.text='hellomyCtrl'
    });
    app.controller('myCtrl2',function ($scope) {
        $scope.text='hellomyCtrl2 嵌套'
    })
    app.controller('myCtrl3',function ($scope) {

    })
</script>
</body>

1.控制器可以嵌套
2.控制器可以多个
3.控制器就近原则
每一个主模块中都会有$rootscope;
所有的控制器都会创建自己的$scope(作用域);
$scope有继承的关系,会继承上一级($rootscope),就是$scope中没有的变量会去上一级寻找,直到$rootscope终止
没有使用控制器的时候,有个$rootscope,根的作用域,(如果$rootstrap中有内容,则可以去继承)

  • 控制器常用方法

  • 防止压缩报错

    <body ng-app="myApp" ng-controller="myCtrl">
    {{text}}
    <script src="./angular-1.5.8/angular.min.js"></script>
    <script>
        var app=angular.module('myApp',[]);
        app.controller('myCtrl',['$scope',function($scope){
            $scope.text='hello';
        }]);
    </script>
</body>

$scope是依赖注入,但是在压缩代码时,会将该参数改为a,则会报错了,爆出参数找不到,
字符串的东西是不会被压缩工具改变的;
如何解决这个报错呢?
防止压缩报错
1.在使用function时,先添加中括号,然后再将function放入中括号,然后再将$scope写为'$scope'写为中括号第一个参数 ,再传进function
2.在压缩后,参数变为a,但是可以拿到参数$scope;
可以在后面继续添加参数,如$log,但是参数必须按照数组中顺序来,顺序不能随便了;
参数的名字要有意义;

  • 控制器变形

1.控制器期写法(引用1.29版本的angular)


<body ng-app="" ng-controller="myCtrl">
<!--上面的ng-app是不需要值的,只需要ng-controller-->
    {{name}}
<script src="./angular-1.2.29/angular.js"></script>
<script>
//直接一个函数然后函数名为控制器名字
    function myCtrl($scope){
        $scope.name="angular早期使用";
    }   
</script>
</body>

这种方法会有全局污染
因而才会有后面的写法

2.控制器函数提取出来用变量作为参数传函数,外部引入函数,也需要防止压缩

<body ng-app="myApp" ng-controller="myCtrl">
    {{text}}
<script src="./angular-1.5.8/angular.js"></script>
<script>
        var app=angular.module('myApp',[]);
        var myCtrl=function(a){
            a.text='1';
        }
        myCtrl.$inject=['$scope'];
        app.controller('myCtrl',myCtrl);
</script>
</body>

注入方式防止压缩(第二种防止压缩的方法)
myCtrl.$inject=['$scope']用来注入,防止压缩
$是服务

  • angular全局方法
  • $$的方法或者属性尽量不要使用
  • bootstrap 用来手动添加ngApp
  • module 用来创建模块
  • version 查看版本
  • 凡属于is开头的都是用来做判断 返回布尔值
  • toJson 将对象转换成Json字符串
  • fromJson 将Json字符串 转换成json对象
  • merge(obj1,obj2) 用来将后面obj2对象合并到obj1中
  • copy(obj1,obj3) 深拷贝obj1到obj3中
  • uppercase lowercase 转换大小写
  • element(精简版)element返回的是jqLite 缺少了很多东西(在angular做页面时候有些地方angular做不到的情况下才用 jqLite或者jquery使用)

深拷贝和浅拷贝

表单验证

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="bootstrap/dist/css/bootstrap.css">
    <style>
        .context{
            margin: 30px auto;
            width: 400px;
        }
        .error{
            border: 1px solid red;
        }
        .infoerror{
            color: red;
        }
    </style>
</head>
<body>
<div ng-app="myApp">
    <!--sigUpCtrl用来控制注册-->
    <div ng-controller="sigUpCtrl">
        <!--使用angular表单验证步骤-->
        <!--1.给你的表单form添加name,同时会在$scope上面添加验证信息-->
        <!--2.给你表单中所有的表单元素添加name-->
        <form  name="sigUpForm"  ng-submit="sigUpSubmit()" class="context"  novalidate="false">
            <!--<pre>{{sigUpForm|json}}</pre>-->
            <div class="form-group">
                <label>用户名</label>
                <!--
                required 用来标识表单是否为空
                ng-maxlength最大字符串
                ng-minlength 最小字符串
                novalidate="false" 禁用required

                touched 表示已经获取过焦点
                untouched 表示没有获取过焦点

                pristine 没有使用过
                dirty 已经使用过

                valid 已经通过验证
                invalid 未通过验证

                error 未通过的错误信息
                -->
               <!--<pre>{{sigUpForm.username | json}}</pre>-->
                <input ng-class="{'error':sigUpForm.username.$invalid&&sigUpForm.username.$touched}" name="username" required type="text"  ng-maxlength="7" ng-minlength="3" class="form-control" placeholder="用户名" ng-model="userdata.username"/>
                <p ng-class="{'infoerror':true}"  ng-show="sigUpForm.username.$error.required&&sigUpForm.username.$touched">用户名为空</p>
                <p  ng-class="{'infoerror':true}" ng-show="sigUpForm.username.$error.minlength||sigUpForm.username.$error.maxlength">长度不能少于3位并且长度不能大于7位</p>
                <!--{{username}}-->
            </div>
            <div class="form-group">
                <label>密码</label>
                <input ng-class="{'error':sigUpForm.pwd.$invalid&&sigUpForm.pwd.$touched}" name="pwd" required type="password"  ng-maxlength="7" ng-minlength="3" class="form-control" placeholder="密码" ng-model="userdata.pwd"/>
                <p ng-class="{'infoerror':true}"  ng-show="sigUpForm.pwd.$error.required&&sigUpForm.pwd.$touched">密码为空</p>
                <p  ng-class="{'infoerror':true}" ng-show="sigUpForm.pwd.$error.minlength||sigUpForm.pwd.$error.maxlength">密码长度不能少于3位并且长度不能大于7位</p>
            </div>
            <div class="form-group">
                <label>确认密码</label>
                <input ng-class="{'error':sigUpForm.pwd2.$invalid&&sigUpForm.pwd2.$touched}" name="pwd2" required type="password"   class="form-control" placeholder="密码" ng-model="pwd2"/>
                <p ng-class="{'infoerror':true}"  ng-show="sigUpForm.pwd2.$error.required&&sigUpForm.pwd2.$touched">密码为空</p>
                <p  ng-class="{'infoerror':true}" ng-show="(userdata.pwd!=pwd2)&&sigUpForm.pwd2.$touched">两次输入密码不一致</p>
            </div>
            <div class="form-group">
                <label>邮箱验证</label>
                <!--邮箱可以采用默认形式的验证-->
                <input ng-class="{'error':sigUpForm.email.$invalid&&sigUpForm.email.$touched}" class="form-control" type="email" name="email" ng-model="userdata.email" required>
                <p  ng-class="{'infoerror':true}"  ng-show="sigUpForm.email.$touched&&(sigUpForm.email.$error.email||sigUpForm.email.$error.required)">邮箱格式不正确</p>
            </div>
            <div class="form-group">
                <!--<pre>{{sigUpForm.phone|json}}</pre>-->
                <label>手机验证</label>
                <!--邮箱可以采用默认形式的验证-->
                <!--ngPattern正则验证-->
                <input ng-class="{'error':sigUpForm.phone.$invalid&&sigUpForm.phone.$touched}" ng-pattern="/^1(3|4|5|7|8)\d{9}$/" class="form-control" type="tel" name="phone" ng-model="userdata.phone" required  >
                <p ng-class="{'infoerror':true}" ng-show="sigUpForm.phone.$touched&&(sigUpForm.phone.$error.pattern||sigUpForm.phone.$error.required)">手机号码有误</p>
            </div>
            <div>
                <!--未通过验证禁止使用这个按钮-->
                <button class="btn btn-primary" ng-disabled="sigUpForm.$invalid"  >注册</button>
            </div>
        </form>
    </div>

    <script src="js/angular.js"></script>
    <script>
        //通过表单验证后存数据
        function Users(userData) {
            this.userData=userData
        }
        Users.prototype.AddUser=function () {
            //模拟Ajax存储数据
            //先去获取localStorage中用户数据
            var str=localStorage["userList"]||'[]';
            //转换成json
            var list=JSON.parse(str);
            //保存数据到list中
            //判断数据中的用户名是否重名,如果重名则不添加
            for(var i=0;i<list.length;i++){
                if(list[i].username===this.userData.username){
                    //重名则返回false
                    return false
                }
            }
            list.push(this.userData)
            //获取完成后再添加用户数据
            localStorage["userList"]=JSON.stringify(list);
            //不重名返回true
            return true;
        }
        var app=angular.module('myApp',[]);
        app.controller('sigUpCtrl',function ($scope) {
            $scope.userdata={}
            $scope.sigUpSubmit=function () {
                //获取到真实数据以后需要将数据保存起来localStorage
               // localStorage key value型保存方式 并且这种保存只能保存字符串
                console.log( $scope.userdata);
                //添加用户信息
                var user=new Users($scope.userdata)
                //保存用户信息
                if(user.AddUser()){
                    alert('注册成功')
                }else{
                    alert('注册失败')
                }
            }
        })
    </script>
</div>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容