流行框架angular

时间:2023-03-09 14:51:54
流行框架angular

---恢复内容开始---

一、angular是什么

一款非常优秀的前端高级js框架,由谷歌团队负责开发

angular是通过新的属性和表达扩展了html

angular可以构建一个单一页面应用程序(spa:single page applications ),使我们做单页面应用更加容易。

angular自身有很多颠覆性特征,改变了前端的编码方式,简化了我们操作

传统网站

流行框架angular

框架与库

无论是angular还是jquery都是用原生js封装的

库:对代码进行封装,调用封装的方法,简化操作 针对某一具体的领域提出的解决方案。

jquery针对dom操作的requery.js模块

框架:虽然也是调用封装方法,但是更多的框架会提供代码书写的规范,我们要按照规则去写代码框架会帮助我们事先相应的功能,针对整个行业提出的解决方案。

二、angular核心思想(write less do more)

其核心思想是通过指令扩展html,通过表达式绑定数据到html,angular不推崇dom操作,也就是说NG中几乎找不到任何的dom操作,一切操作以数据为中心,用数据驱动dom。

获取angular的方式

在官网上下载 通过cdn方式引入到页面中

流行框架angular

三、angular 快速入门

 + 在使用了angular的页面,以ng-开头的属性,都可以称之为指令
    + ng-app
        * 告诉angular它在页面中所要控制的范围
        * 页面加载完成angular会自动在页面中查找这个指令
        * 如果页面中没有这个指令,angular将不会启动
    + ng-model
        * 实现双向数据绑定
    + ng-click
        * 点击事件(和原生JS中的onclick事件作用一样)
    + ng-init
        * 初始化数据
    + 表达式介绍
        * {{}} 这种双大括号的形式称之为插值表达式
        * 在表达式中可以写ng中的变量
        * 可以显示字符串
        * 在表达式中可以进行计算
        * 可以在表达式中写三目运算符

  angular模块化开发的好处

- 模块化开发带来的好处
    + 方便管理, 复用,后期维护方便
    + 解决代码冲突,方便多人协作开发
- 分析模块和控制器与页面之间的关系
- 定义模块的语法规则
- 定义模块时第二个参数加与不加的区别
    + 加第二个参数是创建模块
    + 不加第二个参数是获取模块
- 报错信息分析
    +  Module 'myApp' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.
    + 'myApp' 这个模块是不可获取的! 你要么拼写错误 要么忘了加在他 你要确保一个有效的模块 做为了第二个参数的依赖

  angular中如何使用控制器

- 控制器的作用
    + 向页面中赋初始值
    + 向页面中展示数据
    + 代码分类

  单页面应用程序介绍

单页面应用程序的特点
    + 整个网站由一个页面构成
    + 公共部分只加载一次
    + *利用Ajax局部刷新达到页面切换的目的*
    + 不会发生页面跳转白屏的现象
    + *锚点与页面对应*

  angular中的路由

 + [官方说明文档](https://docs.angularjs.org/api/ngRoute)
    + 如何获取路由模块
        * [通过CDN的方式引入到页面中](https://cdn.bootcss.com/angular.js/1.6.4/angular-route.min.js)
    + 在html页面中通过script标签的方式引入路由模块文件
    + 在应用主模块中依赖路由模块ngRoute
    + 配置路由
        * 通过config方法注入$routeProvider
        * 介绍配置中常用的参数
    + 路由和控制器的整合
    + 使用templateUrl方式载入模板需要在http环境下(本地file协议下不支持)

  控制器中$scope不能改成其他名字,angular是根据形参的名字去传递实参

angular常用指令

指令分类:内置指令(普通指令,事件指令)自定义指令

- 普通指令
    + ng-repeat 遍历数据
        ```html
        <body ng-app="myApp" ng-controller="demoCtrl">
            <h4>遍历 一维数组</h4>
            <ul>
                <!--
                    ng-repeat 遍历数据 类似于for in 循环
                    in 是固定写法
                    in 后面加上要遍历的数据
                    item 是遍历的当前项(item这个词可以随意写)
                    这个指令可以加在任何标签上
                -->
                <li ng-repeat="item in data">
                    {{item}}
                </li>
            </ul>
            <hr />
            <h4>遍历 数组中混合对象</h4>
            <p ng-repeat="item in person">{{item.name}} {{item.age}}</p>
            <hr />

            <h4>遍历 对象</h4>
            <!--
                key代表对象的键值
                val代表对象键值对应的值
            -->
            <div ng-repeat="(key,val) in obj">
                {{key}} {{val}}
            </div>

            <script src="node_modules/angular/angular.min.js"></script>
            <script>
                angular.module('myApp',[])
                    .controller('demoCtrl',['$scope',function($scope){

                        // 一维数组
                        $scope.data = ['小明','小红','小黑','小琴'];

                        // 数组中混合对象(最常用的形式)
                        $scope.person = [
                            {name:'小明',age:18},
                            {name:'小红',age:28},
                            {name:'小红',age:28},
                            {name:'小黑',age:38},
                            {name:'小琴',age:48}
                        ]

                        // 对象
                        $scope.obj = {
                            name:'小明',
                            age:35,
                            hobby : '吃饭'
                        }

                    }])
            </script>
        </body>
        ```

    + ng-repeat 补充

        ```html
        <body ng-app="myApp" ng-controller="demoCtrl">

            <!--

                在遍历的过程中
                    $index : 遍历过程中的索引
                    $first : 布尔类型的值 当前是否是第一项 是返回true 不是返回false
                    $last  : 布尔类型的值 当前是否是最后一项 是返回true 不是返回false
                    $middle : 布尔类型的值 第一项和最后一项返回false 其余返回true
                    $even : 偶数项返回true 否则返回false
                    $odd : 奇数项返回true 否则返回false

                我们可以利用这些值在循环的过程中做各种判断 达到我们想要的目的
            -->

            <ul>
                <li ng-repeat="item in person" class="{{$first ? 'first' : ''}} {{ $last ? 'last' : ''}}">
                    <p>名字:{{item.name}}</p>
                    <p>年龄:{{item.age}}</p>
                    <p>索引:{{$index}}</p>
                    <p>是否是第一项:{{$first}}</p>
                    <p>是否是最后一项:{{$last}}</p>
                    <p>是否是中间项:{{$middle}}</p>
                    <p>是否偶数项:{{$even}}</p>
                    <p>是否奇数项:{{$odd}}</p>
                </li>
            </ul>

            <!--

                默认情况下遍历的数组中不能有重复类型的值(基本数据类型) 否则会报错 信息如下

                [ngRepeat:dupes]  ng-repeat指令被愚弄(调戏)了

                解决: 在遍历的数据后面写上track by 一个唯一(不重复)的值  一般会写$index

            -->

            <hr />

            <div ng-repeat="item in data track by $index">
                {{item}}
            </div>

            <hr />

            <div ng-repeat="(key,val) in data track by key">
                {{val}}
            </div>

            <hr />

            <!-- 通过奇偶数做隔行变色 -->

            <style>
                .even{background:pink;}
                .odd{background:lightblue;}
            </style>
            <ul>
                <li ng-repeat="item in person" class="{{$even ? 'even' : 'odd'}}">
                    <p>名字:{{item.name}}</p>
                    <p>年龄:{{item.age}}</p>
                    <p>索引:{{$index}}</p>
                    <p>是否是第一项:{{$first}}</p>
                    <p>是否是最后一项:{{$last}}</p>
                    <p>是否是中间项:{{$middle}}</p>
                    <p>是否偶数项:{{$even}}</p>
                    <p>是否奇数项:{{$odd}}</p>
                </li>
            </ul>

            <script src="node_modules/angular/angular.min.js"></script>
            <script>
                angular.module('myApp',[])
                    .controller('demoCtrl',['$scope',function($scope){

                        $scope.person = [
                            {name:'小明',age:18},
                            {name:'小红',age:28},
                            {name:'小红',age:28},
                            {name:'小黑',age:38},
                            {name:'小琴',age:48}
                        ]

                        // 数组中存在重复的值
                        $scope.data = ['小明','小红','小明','小红'];

                    }])
            </script>
        </body>
        ```

    + 在循环的过程中如果有重复项 需要加上 track by $index

    + ng-class指令 用来操作类名

        ```html
        <body ng-app="myApp" ng-controller="demoCtrl">
            <style>
                button {
                    width: 120px;
                    height: 40px;
                    border: none;
                    outline: none;
                    color: #FFF;
                    font-size: 16px;
                }

                .red {
                    background: red;
                }

                .green {
                    background: green;
                }
            </style>
            <!--
                ng-class指令:专门用来操作类名的

                    1.指令的值以对象的形式存在
                    2.对象的属性值转化为布尔值是true时,将当前的属性名作为类名添加到class属性中
                    3.对象的属性值转化为布尔值是false时,将当前的属性名从class属性中删除掉
                    4.属性值可以是数据模型,也可以是JS表达式

                注意:angular不推崇DOM操作,在当前例子中并没有直接操作类名的JS语句,
                而是通过数据模型isGreen的值是true还是false来确定添加哪个颜色的类名,
                至于如何添加到class属性中,由angular替我们完成。

            -->
            <button ng-class="{'green':isGreen,'red':!isGreen}" ng-click="setColor()">按钮</button>
            <script src="node_modules/angular/angular.min.js"></script>
            <script>
                angular.module('myApp', [])
                    .controller('demoCtrl', ['$scope', function($scope) {

                        // isGreen用来控制当前按钮是绿色还是非绿色
                        $scope.isGreen = true;

                        // 用来切换按钮的颜色
                        $scope.setColor = function(){

                            // 让isGreen在每次点击按钮的时候跟当前值取反
                            // 也就是一次是true 一次是false
                            // 以达到切换颜色的目的
                            $scope.isGreen = !$scope.isGreen;

                        }

                    }])
            </script>
        </body>
        ```

    + ng-bind ng-bind-template ng-cloak 数据绑定 解决表达式闪烁问题

        ```html
        <body ng-app="myApp" ng-controller="demoCtrl">
            <!--
                在angular没有被加载进页面之前,浏览器会将下面的
                表达式当作普通字符串显示在页面中,angular在被加
                载进页面之后,才会将下面的表达式替换成了对应的数
                据,这样就会存在闪烁问题
            -->
            {{msg1}}

            <!--
                用指令ng-bind绑定数据解决这个问题
                ng-bind指定是专门用来做数据绑定的
            -->
            <div ng-bind="msg1"></div>

            <!--
                除此之外,还有一个指令ng-cloak,也可以解决表达式闪烁的问题
                angular会隐藏有ng-cloak指令或样式的元素,在做完解析之后又会
                移除元素身上的ng-cloak样式和指令,从而解决表达式闪烁的问题

                但是!angular在页面的最后才被引用进来,所以不能很好的解决这
                个问题需要我们手动在页面顶部加上隐藏元素的样式
            -->
            <style>
                .ng-cloak,[ng-cloak]{display:none;}
            </style>
            <div class="ng-cloak">
                {{msg2}}
            </div>

            <div ng-cloak>
                {{msg2}}
            </div>

            <script src="node_modules/angular/angular.min.js"></script>
            <script>
                angular.module('myApp',[])
                    .controller('demoCtrl',['$scope',function($scope){

                        $scope.msg1 = '指令ng-bind解决表达式闪烁问题';
                        $scope.msg2 = '指令ng-cloak解决表达式闪烁问题';

                    }])
            </script>
        </body>
        ```

    + ng-non-bindable 不解析表达式

    + ng-show、ng-hide 通过样式的方式控制元素显示隐藏

        ```html
        <body ng-app="myApp" ng-controller="demoCtrl">

            <!--

                ng-show :控制元素显示隐藏(通样式的方式)

                    当值为true时 元素显示
                    当值为false时 元素隐藏

                ng-hide :控制元素显示隐藏(通样式的方式)

                    当值为true时 元素隐藏
                    当值为false时 元素显示

            -->

            <h3>例子1 当没有数据的时候显示 '暂无数据'</h3>
            <ul>
                <li ng-repeat="data in list">
                    <span>{{data.id}}</span>
                    <a href="#">{{data.title}}</a>
                    <div>
                        {{data.description}}
                    </div>
                </li>
            </ul>

            <!-- 

                当没有数据的时候显示 "暂无数据"

                可以通过ng-show指令 如果存放数据的数组长度为0
                也就是没有数据 表达式返回true 当前div显示

                如果存放数据的数组不为0 表达式返回false 当前div隐藏

                也可以用ng-hide="list.length" 达到相同效果(自行思考)

            -->
            <div ng-show="list.length == 0">暂无数据</div>
            <a href="javascript:;" ng-click="resetData()">清空数据</a>

            <hr />

            <h3 ng-init="isToggle=true">例子2 选项卡切换</h3>
            <button ng-click="isToggle=true">显示1</button>
            <button ng-click="isToggle=false">显示2</button>
            <div ng-show="isToggle">1</div>
            <div ng-show="!isToggle">2</div>

            <script src="node_modules/angular/angular.min.js"></script>
            <script>
                angular.module('myApp',[])
                    .controller('demoCtrl',['$scope',function($scope){

                        $scope.list = [
                            {
                                id:'1',
                                title:'有人在微信QQ上拉你搞投资?那都是骗子!',
                                description : '喜欢炒股的朋友或许经常在微信或者QQ收到各种“业务员”的推广,有的介绍老师给你,有的介绍私募给你,有的是亲自操刀上阵,通常情况下是在操作获利之后五五分成,在操作一段时间之后,“业务员”会告诉你最近股市不好做,不好赚钱,而“我们有新的业务”,可以快速地获得利润,再给你发一些高收益的截图。'
                            },
                            {
                                id:'2',
                                title:'女子被"男友"骗150万 相处3年不知对方系闺蜜假扮',
                                description : '时报讯 今年2月,杭州市滨江警方接到一起报警,报警人林芬(化名)称2014年至2017年间,自己被男友高鹏(化名)骗了共计150多万元。近日,民警抓获了该案嫌疑人,一看,这高鹏啊,不仅是个女的,还是林芬的闺蜜。'
                            }
                        ]

                        // 删除数据方法
                        $scope.resetData = function(){

                            // 快速清空数组
                            $scope.list.length = 0;

                            // 也可以将数组重新复制为空数组
                            // $scope.list = [];

                        }

                    }])
            </script>
        </body>
        ```

    + ng-if 控制元素显示隐藏
        * 和ng-show用法相同
        * 区别是ng-if是通过DOM节点的添加和删除使得元素显示和隐藏

    + ng-switch、ng-switch-when

        ```html
        <!--
            ng-switch ng-switch-when 是一对指令类
            似于JS中 switch case 语句

            匹配到哪项 哪项就显示 其他项就隐藏

            常用于 做多个选项卡的显示和隐藏

        -->
        <body ng-app ng-init="showNum=1">
            <div ng-switch="showNum">
                <button ng-click="showNum=1">显示1</button>
                <button ng-click="showNum=2">显示2</button>
                <button ng-click="showNum=3">显示3</button>
                <div ng-switch-when="1">1</div>
                <div ng-switch-when="2">2</div>
                <div ng-switch-when="3">3</div>
            </div>
            <script src="node_modules/angular/angular.min.js"></script>
        </body>
        ```

    + ng-options 生成select下拉列表 需要配合ng-model指令使用 否则报错

        ```html
        <body ng-app="myApp" ng-controller="demoCtrl">

            <!--
                ng-options :生成下拉框列表 需要和ng-model指令配合使用

                ball in balls 类似于ng-repeat

                    balls 是要进行循环的数据

                    in 固定写法

                    ball 是每次循环的当前项

                ball.name for

                    for 固定写法

                    ball.name 将要显示在option标签内的值

                ball.value as

                    as 固定写法

                    ball.value 将要显示在option标签value属性中的值

            -->

            <select ng-model="likeBall" ng-options="item.value as item.name for item in balls"></select>

            {{likeBall}}

            <script src="node_modules/angular/angular.min.js"></script>
            <script>
                angular.module('myApp',[])
                    .controller('demoCtrl',['$scope',function($scope){

                        // 给下拉列表设置默认值 和options标签value属性的值对应
                        $scope.likeBall = "001";

                        // 下拉列表的数据源
                        $scope.balls = [
                            {
                                name:'足球',
                                value:'001'
                            },
                            {
                                name:'篮球',
                                value:'002'
                            },
                            {
                                name:'橄榄球',
                                value:'003'
                            },
                            {
                                name:'排球',
                                value:'004'
                            },
                            {
                                name:'乒乓球',
                                value:'005'
                            }

                        ];

                    }])
            </script>
        </body>
        ```

- 事件指令
    + ng-click
    + ng-dblclick
    + ng-blur
    + ng-focus
    + ng-change
- 其他指令
    + ng-href
    + ng-src
    + ng-value

四、mvc   mvvm介绍

mvc思想源于后端
m model模型 数据和数据相关的方法(直接操作数据库的方法)
v view视图 用户界面
c controller控制器 网站的业务逻辑都写在控制器里面
对代码进行分类,便于管理
mvc思想并不完全适用于前端
mvc里面的控制器做的事情太多了 代码又变得冗余

mvvm思想
它并不是一个全新的思想 是对mnv思想的改进 升级
m model模型 数据和数据相关的方法 ajax请求
v view视图 用户界面
vm 它都是根据数据双向绑定有关系$scope
angular 就是基于mvvm这样的一个前端框架

五、angular中数据请求方式

- angular中提供了一些方法,我们可以用这些方法向后台发送请求,获取数据
- 语法:
+ 标准的请求方式(通过例子说明)
* $http()
+ 简化的请求方式(通过例子说明)
* $http.get()
* $http.post()
- [ng-bind-html](https://cdn.bootcss.com/angular.js/1.6.4/angular-sanitize.min.js)

六、angular中的过滤器

我们从后台请求的数据,有时候不是我们想要的格式 。

过滤器的概念:angular为我们提供的处理数据格式的方式

过滤器的分类:内置过滤器 自定义过滤器

- 使用过滤器的语法:
    + {{ 数据模型 | 过滤器的名字:过滤器的参数:多个参数以冒号隔开 }}
- 内置过滤器介绍
    + currency 货币过滤器
    + date 日期过滤器
    + filter 将数据按照某种规则进行过滤
        * 模糊过滤
        * 精确过滤
    + limitTo 限制
    + orderBy 排序

  angular自身只是提供了一些常用的过滤器,在实际项目中,我们往往会遇到一些比较具体的需求,这是我们需要自定义过滤器

- 语法:
    + 如何定义自定义过滤器
    ```javascript
    模块对象.filter('自定义过滤器名字',[function(){
        return function(要处理的数据,滤过器参数1,滤过器参数2,...){
            // 具体处理数据的代码
            return 处理后的数据;
        }
    }])
    ```

  以上是个人对angular学习的认识,大家有更好的知识欢迎留言,谢谢