首页 > 技术文章 > AngularJS文字笔记

dcfkm666 2021-06-02 16:43 原文

1. **双向数据绑定**
	* View(视图): 页面(标签、指令,表达式)
	* Model(模型) :作用域对象(属性、方法)
	* 数据绑定: 数据从一个位置自动流向另一个位置
		* View-->Model
		* Model-->View
	* 单向数据绑定: 只支持一个方向
		* View-->Model  : ng-init
		* Model-->View  : {{name}}
	* 双向数据绑定
		* Model<-->View  : ng-model
	* angular是支持双向数据绑定的
2. **依赖注入**
	* 依赖的对象被别人(调用者)自动注入进入
	* 注入的方式;
		* 内部自建:不动态 
		* 全局变量:污染全局环境
		* 形参:这种最好
	* angualr就是通过声明式依赖注入, 来得到作用域对象 
	* 形参名不能随便定义(只是针对当前这种写法)
3. ** MVC模式**
  * **M: Model, 即模型**, 在angular中: 
    * 为scope
    * 储存数据的容器
    * 提供操作数据的方法
  * **V: View, 即视图**, 在angular中:
    * 为页面
    * 包括: html/css/directive/expression
    * 显示Model的数据
    * 将数据同步到Model
    * 与用户交互
  * **C: Controller, 即控制器**, 在angular中:
    * 为angular的Controller
    * 初始化Model数据
    * 为Model添加行为方法
4. **MVVM模式**
  * M: Model, 即数据模型, 在angular中:
    * 为scope中的各个数据对象
  * V: View, 即视图, 在angular中:
    * 为页面
  * VM: ViewModel, 即视图模型, 在angular中:
    * 为scope对象
  * 在angular中controller不再是架构的核心,在MVVM中只是起辅助作用,用来辅助$scope对象,即VM层

  

1. **作用域**
	* 是一个js实例对象
	* 这个对象的属性、方法, 页面都可以直接引用、操作
	* ng-app指令: 内部创建一个根作用域($rootScope), 是所有其它作用域的父对象
2. **控制器**
	* 也是一个对象,是我们View与Model之间的桥梁
	* 当我们使用了ng-controller指令, 内部就会创建控制器对象
	* 但我们同时得提供控制器的构造函数(必须定义一个$scope的形参)
	* 每定义一个ng-controller指令, 内部就会创建一个新的作用域对象($scope), 并自动注入构造函数中,在函数内部可以直接使用$scope对象。
3. **模块**
	* 也是一个对象
	* 创建模块对象: angular.module('模块名', [依赖的模块])
	* 通过模块添加控制器:
	    * module.controller('MyController', function($scope){//操作$scope的语句})
	* angular的整体设计也是多模块的
		* 核心模块: angular.js
		* 扩展模块: angular-router.js, angular-message.js, angular-animate.js

  

1. **表达式**
    * {{js表达式}}
    * 从作用域对象中读取对应的属性数据来显示数据
    * 不支持if/for/while
    * 支持三目表达式
2. **指令**
    * 什么指令 : 自定义标签属性/标签
    * 常用的指令:
        * ng-app: 指定模块名,angular管理的区域
        * ng-model: 双向绑定,输入相关标签
            * ng-model-options="{updateOn: 'blur'}"  控制光标移开就展示
        * ng-init: 初始化数据
        * ng-click: 调用作用域对象的方法(点击时)
          可以传$event
        * ng-controller: 指定控制器构造函数名,内部会自动创建一个新的子作用域(外部的)
        * ng-bind: 解决使用{{}}显示数据闪屏(在很短时间内显示{{}})
            * ng-bind-template: 可以实现多个{{}} 如 <div ng-bind-template="{{text}}, {{text}}"></div>
        * ng-cloak: 也是解决数据闪屏  他使用的是 css中的 display:none  解析之后就是block
        * ng-non-bindable: 不去解析
        * ng-repeat: 遍历数组显示数据, 数组有几个元素就会产生几个新的作用域
            * $index, $first, $last, $middle, $odd, $even
            * 可以通过ng-repeat-start 和 ng-repeat-end实现兄弟之间的循环
        * ng-show: 布尔类型, 如果为true才显示
        * ng-hide: 布尔类型, 如果为true就隐藏
        * ng-class: 动态引用定义的样式  {aClass:true, bClass:false}
    * ng-style: 动态引用通过js指定的样式对象   {color:'red', background:'blue'}
    * ng-mouseenter: 鼠标移入监听, 值为函数调用, 可以传$event
    * ng-mouseleave: 鼠标移出监听, 值为函数调用, 可以传$event
    * ng-fours/blur: 获取和失去焦点
    * ng-submit: 提交
    * ng-selected: 默认是false  被选择就是true
    * ng-change: 输入框发生改变就会触发 要配合ng-model
    * ng-copy: 输入框出现复制就会触发
    * ng-cut: 输入框出现剪切就会触发
    * ng-paste: 输入框出现粘贴就会触发
    * ng-disabled: 禁用标签
    * ng-readonly: 输入框不能输入 但不是灰色的禁用
    * ng-checked: 是true就是选中状态  不是就不是选中状态
    * ng-value: 相比于value  用户体验会比较好
    * ng-attr-title: 可以让鼠标移出显示提示文字
    * ng-switch   之后的是 ng-switch-default是默认显示的  ng-switch-when是false就是显示切换的
    * ng-open: 打开和关闭  h5上有个details标签
    * ng-include: 可以引入其他的页面 ng-include="index.html"
    * ng-controller: ng-controller="Fnarr as a1"    {{a1.text}}
    * novalidate: 阻止表单默认的样式
    * ng-attr-id: ng-attr-id="div{{id}}"  {{id}}
3. **过滤器**
    * 作用: 在显示数据时可以对数据进行格式化或过滤
        * 单个--->格式化(将别的类型的数据转换为特定格式的字符串)
        * 多个----》格式化/过滤
        * 不会真正改变被操作数据
    * {{express | 过滤器名:补充说明}}
    * 常用过滤器:
        * currency 货币格式化(文本)
        * number数值格式化(文本)
        * date 将日期对象格式化(文本)
        * json: 将js对象格式化为json(文本)
        * lowercase : 将字符串格式化为全小写(文本)
        * uppercase : 将字符串格式化全大写(文本)

        * limitTo 从一个数组或字符串中过滤出一个新的数组或字符串
            * limitTo : 3  limitTo : -3
        * orderBy : 根据指定作用域属性对数组进行排序
            * {{[2,1,4,3] | orderBy}}  升序
            * {{[2,1,4,3] | orderBy:‘-’}}  降序
            * {{[{id:2,price:3}, {id:1, price:4}] | orderBy:'id'}  id升序
            * {{[{id:2,price:3}, {id:1, price:4}] | orderBy:'-price'} price降序
        * filter : 从数组中过滤返回一个新数组
            * {{[{id:22,price:35}, {id:23, price:45}] | filter:{id:'3'}} //根据id过滤
            * {{[{id:22,price:35}, {id:23, price:45}] | filter:{$:'3'}} //根据所有字段过滤
4. **location**
    * $location的一些方法
        * absUrl(): 获取到绝对地址,加参数也会显示出来
        * path(): 可以设置也可以获取,是一个路径,$location.path('aa');  之后获取就是 http://xxxxx#/aaa
        * replace(): 设置了可以location历史管理的操作。没有前进后退  $location.path('aa').replace()
        * hash(): 设置获取哈希值 $location.hash('hello')
        * search(): $location.search({'age': 20})
        * url(): 得到路径 不是全部的 path是全部的
        * host(): 得到location
        * port(): 得到端口
        * protocol(): 得到协议
    * $anchorScroll 锚点调整
        * 需要配合$location.hash()配合就可以使用 $anchorScroll
        * 原本hash是div4 之后你上下滚动再点击div4想跳转到div4的位置 就需要重新调用一次 $anchorScroll()    
    * $cacheFactory 缓存
        * put() 添加缓存
        * get() 获取缓存
        * info() 获取缓存的信息 size
        * capacity() 设置缓存的长度   在$cacheFactory('myCache', {capacity: 2})
    * $log 调试
        * $log.log()
        * $log.info()
        * $log.warn()
        * $log.erro()
    * 供应商服务   必须是config然后在 $anchorScroll后面加 Provider  可以对自定义服务进行修改
        * angular.module('myapp', [])
                        .config(['$anchorScrollProvider', function($anchorScrollProvider){
                            $anchorScrollProvider.disableAutoScrolling()
                        }])
        -----------------------------------------------------------------------------------
            m1.provider('myService', function(){
                return{
                    name: 'hello',
                    $get: function(){
                        return{
                            name: this.name,
                            show: function(){
                                return this.name + ':angular'
                            }
                        }
                    }
                }
            })
            
            m1.config(['myServiceProvider', function(myServiceProvider){
                console.log(myServiceProvider);
                myServiceProvider.name = 'hi'
            }])


            m1.controller('a1', ['$scope','myService', function($scope, myService){
                console.log(myService.show());
            }])
        -----------------------------------------------------------------------------------
        // 在m1模块引入自定义服务 myService服务 在后面添加   
        // 也可以把这个自定义服务进行模块化的引入在多个文件中引入,和插件的方法差不多
        var m1 = angular.module('myApp', ['module1'])
        m1.controller('a1', ['$scope','myService', function($scope, myService){
            console.log(myService.show());
        }])

        var m2 = angular.module('module1', [])
        m2.factory('myService', function(){
            return{
                name: 'tom',
                show: function(){
                    return this.name + ':angular'
                }
            }
        })
        -----------------------------------------------------------------------------------
    * factory

 

推荐阅读