AngularJs学习总结

1、AngularJS 是什么?

       AngularJS是为了克服HTML在构建应用上的不足而设计的。HTML是一门很好的为静态文本展示设计的声明式语言。但要构建WEB应用的话它就显得很乏力,所以AngularJS做了一些工作来解决静态网页技术在构建动态应用上的不足

       AngularJS的初衷是为了简化web APP开发,精髓是简单

      

<div ng-app>

              <input type="text" ng-model='msg'>

              <h1>{{msg}}</h1>

       </div>

 

    标签作用

       Ng-App :是让angular知道他要解析的范围(容器标签)

       Ng-model : angular解析时知道这个后面的变量要绑定数据的

                            {{ }} ,这时插值表达式,作用是解析双括号中的表达式。

扫描二维码关注公众号,回复: 3156971 查看本文章

执行过程:页面加载完成后,angular.js加载完成,加载完成后,angular会在整个页面中寻找ng-app后,会确定解析的范围,然后发现input标签中有ng-model指令

发现ng-model后,它会在作用域中定义一个变量(msg),保存用户输入值

                再往下解析发现{{ }}插值表达式,要显示插值表达式中的内容,把msg变量中的值显示出来。

                再往下发现div标签结束,ng-app的解析范围到此结束

              定义默认变量

                     通过ng-init能定义初始化的变量,定义方式,不用写var,直接写变量名=值,多个变量名用分号隔开

                     另一个绑定数据方式

                            Ng-bind指令 :(环境变量)表达式

                    

<span ng-bind=’x’><span>

                            把x这个变量的值渲染到span标签内容中,刷新页面时不会看到插值表达式。

                            作用域

                            通过ng-init指令在标签中定义变量太多时,页面会显得臃肿,同事作用域也不好访问。所有我们要通过js来定义变量,和找作用域。

                     Module()这个方法是找容器范围,然后再撞见作用域(需要使用controller方法)

                     参数(2个)

                            第一个:找ng-app范围,这时需要给ng-app=‘变量名

                            第二个: 注入依赖,是一个数组,但是这个数组必须写,即使是空数组也必须写上去。

                     创建作用域

                            Angular中是通过ng-controller  来创建作用域,我们需要在标签中通过ng-controller  =“变量名”来创建作用域

                     <div ng-controller =’first’><div/>  app.controller(‘first’,function(){})

                                   下一步需要同期范围对象调用controller方法,这时就能创建作用域

                            Controller()方法有2参数

                            第一个参数:是创建的作用域的变量名

                            第二个参数:是函数(function()),在这个函数内部我们可以定义变量,功能

             

              作用域直接访问this,arguments

              This返回空对象

              Argments 是空数组

              需要注入一个局部变量:$scope 这时我们可以在$scope上定义变量和方法

    绑定事件

              需要使用功能 ng-时间名称=函数调用,这个需要写在标签内

              函数定义需要写在局部作用域$scope上

              事件对象:$event

              绑定事件时:传递的参数可以是 数字,字符串

                                   还可以是 事件对象 $event

                                   还可以传变量      

<div ng-controller='myCtrl'>

       <button ng-click='demo($event)'>red</button>

       <button ng-click='demo(1)'>yellow</button>

       <button ng-click='demo(arr[2])'>green</button>

       <h1>{{result}}</h1>

</div>

    显示隐藏

              显示指令 :ng-show

              隐藏指令 :ng-hide

              都接收布尔值,布尔值是true时生效,布尔值是false时不生效

    过滤器

              主要作用是帮我们事先一些功能,减少页面代码量。

              使用方法

                     {{数据 | 过滤器:参数 1:参数 2}}

              Currency

                            <span>{{price | currency :’’:0[wd1] }}</span>

                            ¥: 钱的标志

              Date 日期过滤器

                            <span>{{date | date : yyyy-MM-dd HH:mm:ss[wd2] ’}}

             

     Filter 过滤器

                     010

              {{数据 | filter: 参数}}

       参数可以是字符串:过露出的结果是包含指定字符串的结果

       参数可以是变量 : 根据变量的值来筛选包含变量值的结果

       参数可以是函数: 函数定义筛选规则,根据这个规则筛选结果

                                   函数必须要有返回值,返回值就是筛选后的结果

                                   这个函数不能写成调用形式。

     字符串过滤器

 

              转换大写:uppercase()

              转换小写:lowercase()

              字符串截取: limitTo :limit 截取:begin开始位置

                                                 : 开始:截取几个

                     和js中的字符串截取方法substr方法相识

                     还可以截取数组

     Number 过滤器

              把数字转成科学计数法

              {{ 数组 | number:参数}}

       参数:保留有效数字的位数

 

     Order By 排序过滤器

              {{数组 | orderBy :参数1 :参数2}}

              参数1:排序规则

              参数2:正序还是倒序,这里接受布尔值

                            False表示正序(默认)

                            True 表示倒序

         自定义过滤器

              Angular给提供了一个方法,专门来自定义过滤器

              Filter()方法需要在angular放回对象上调用

              Filter()方法需要在angular返回对象上调用

              Filter(参数1,参数2)

              参数1:是过滤器的名称

              参数2:是工程函数

                     工厂函数必须有返回值,返回值是一个函数,这个函数就是我们定义的功能。

                     返回的函数

第一个参数是要进行改变的值

从第二个参数开始,就是过滤器中的参数

脏值检测(表单验证)

       四个属性:

                     $dirty                    判断是否输入过   (true表示输入过)

                     $pristine               判断是否没有输入过 (true表示没有输入过)

 

 

                     $invalid                 判断输入是否不合法   true 表示不合法

                     $valid                   判断输入是否合法       true表示合法

表单验证    

                     最大长度:

                                   H5:max-length

                                   Angular:指令 ng-maxLength=‘长度’

                     最小长度:

                                   H5:min-length

                                   Angular:指令ng-minLength=‘数字’

                     必填项:

                                   Ng-requried =布尔值

                                   True 表示必填项 false 表示不是必填项

                     正则:

                            Ng-pattern =‘/正则表达式/’

                     是否禁用:

                            Ng-disabled =布尔值 true表示禁用 false表示不禁用

                     是否只读:

                            Ng-readyOnly=布尔值 true表示只读,false表示可修改的

                     是否被选中

                            Ng-checked=布尔值

                     提交:

绑定在form表单上  ng-submit=‘函数()’,这时要求form表单中有submit类型,

是否发生过改变:

       Ng-change=‘函数()’

                            整个form表单上也有脏治检测 的四个属性

                                          判断的是整个form表单的属性状态。

        注入定时器服务

                     正常的原生定时器在angular中不能使用,需要使用angular给订好的“服务”

                     想使用需要注入这个服务

                     延时定时器服务

        Ng-href/ng-src

              Ng-href是给a标签绑定路径  /ng-src 给有src属性的标签添加路径

              作用:在异步加载时,避免错误

             

 

        Ng-class

                     动态的给元素添加类名

                            有四种方式:

                                   第一种:值可以是字符串 ng-class=“‘demo’”;

                                   第二种:值可以是变量:ng-class=‘变量’;

                                   第三种:值可以是对象:ng-class=“{red:‘TRUE[wd3] ’}”;

                                   第四种:值可以给数组:ng-class=‘[bl,’demo’]’

        Ng-if/ng-switch

Ng-if=布尔值 布尔值为true表示成立,布尔值为false表示不成立。Ng-if没有else功能。

                     Ng-swith

                                   监听时使用on来绑定监听的值

                     Ng-swith-when=‘条件’,相当于switch中的case

                     Ng-switch-default=‘默认条件’,相当于switch中的default

        Ng-repeat

                     循环

                     基本用法:ng-repeat=“item in 数组”

                            {{item}}就是数组中的元素

                     Angular 还提供了6个临时变量

                     $index   索引值

                     $first     数组中的第一个元素

                     $last      数组中最后一个元素

                     $middle   数组中除了第一个和最后一个元素的其他元素

                     $odd      奇数

                     $even       偶数

                            做判断

    自定义指令

                     是 angular给提供的方法

                            Directive(名称,function)

参数1:自定义指令名称,规范:变量-变量

参数2:工厂函数---》这个函数必须有返回值,返回值是对象。对象中定义属性和方法,

自定义指令的名称规范

              Html里面:变量-变量   my-title

              Js里面:变量变量(第二个变量首字母大写)  myTitle

自定义指令有四种类型:

              属性类型:<div my-title=’123456’></div>    字母:A

              元素类型:<my-title></my-title>                          字母:

                                          类 类型 : <div> class =’my-title’></div>     字母:C

                                          注释类型:<!—directive:my-title - ->                   字母:M

Template:

              自定义指令模板

              页面中显示的内容在这个定义

templateUrl1

              能引入外部的Html文件

            Replace

                            接收布尔值

                            True:表示替换原来的标签

                            False:表示不替换,是插入功能(默认值)

            自定义指令作用域

自定义指令的作用域也是通过controller创建的,但是是自定义指令函数返回值中定义这个作用域

自定义指令默认是没有参数的,所以需要使用寿命参数,就要注入寿命参数

常用的参数:作用域($scope),元素($element),属性($attrs)

       作用域($scope): 自定义指令的作用域

       元素($element):自定义指令标签,可以直接使用类似jquery的操作元素方法

       属性($attrs):自定义指令的属性   

 

自定义指令的作用域和外层作用域的关系:

       如果自定义指令没有定义变量,自定义指令可以使用外层作用域中的变量;默认情况下:都使用自定义指令的作用域。

Scope属性:可以设置自定义指令和外层作用域的关系

       Scope属性值:

                     True:自定义指令的作用域和外层作用域互相独立

                     False:(默认值)都使用自定义指令的作用域

                     {} 对象: 互相独立的

       如果scope的属性值是{},自定义指令想使用外层的数据,我们需要修饰符

修饰符:有俩种

       第一种:  @修饰符

              使用时分俩步:第一步,需要在HTML中使用插值表达式接收值

                                   第二步,在js中scope属性{} 内使用@修饰符

       第二种:  =修饰符

              使用时也分俩步:

                     第一步:在HTML中绑定(不能使用插值表达式),

                     第二部:在js中scope属性{}内使用 = 修饰符

       Scope属性false和{} 的区别

                     False会轻质使用自定义指令的作用域,所有外层定义的属性都会无效;而{} 形式的可以通过修饰符来决定哪些是通用的,哪些是私有的。

$http服务

              Angular把数据请求也封装了,我们请求数据时可以直接使用它提供的$http服务

              使用时:需要注入服务

              使用方法:

                     1、$http({

                                   url:路径

                                   method:请求方式,GET/POST

                                   params:get请求发送的数据,是对象形式{},

                                   data  :post 请求方式的数据,也是对象形式{},

                                   headers:{

       ‘Content-type’:’application/x-www-form-urlencoded’

},post请求时使用

})。Success(res){

Console.log(res);

}.error(res){

       Console.log(res);

}

返回值有四个:

              第一个:返回的数据;

              第二个:http状态码;

              第三个:函数;

              第四个:http请求信息

注意:$http中的url不管是get请求还是post请求,都可以带数据

 

Get请求:

       $http.get(参数1,参数2)。Success(function(res){})

              参数1:路径

              参数2:要发送的数据

 

       Psot请求:

              $http.post(参数1,参数2,参数3)。Success(function(res){})

              参数1:路径

              参数2:要发送的数据

              参数3:配置数据

      

        路由:

                            Angular中有俩种路由,一种是指令路由:ngRoute,

                                                               还有一种是ui路由:ui.router.

                            路由:根据地址栏中地址的改变加载不同的页面。

                            Angular中没有定义这些路由,使用时需要引用这些模块。引入是在module(‘myapp’,[] 第二个参数数组中

                     指令路由,

                     NgRoute,所有指令都是以ng-开头

              使用步骤:

                            第一步:需要引入js文件,需要放在angular文件下面;

       第二步:需要在angular实例对象上引入ngRoute,module(‘myapp’,[‘ngRoute’]);

       第三步:页面中需要有一个盛放内容的容器,需要有ng-view这个指令

                                   <div ng-view></div>

       第四步:需要在angular对象上调用conifg配置,需要引入指令路由的一个对象$routeProvider,这个对象上有个方法叫when(),在when()方法中配置路由               

              When()方法有俩个参数:

                            第一个参数:路径

                            第二个参数:路径匹配对象

                                   常用的配置有:

                                          Template:‘字符串’,要显示的模板内容

                                          templateUrl:‘html文件

controller:定义作用域’         

controller:俩种用法

  1. controller:function($scope){}
  2. controller:controller:’firstCtrl    

这是需要单独定义 这个控制器,angular对象定义:controller(‘firstCtrl’,function(){})

                    

                      

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

</head>

<body ng-app='myapp'>

<div ng-controller='myctrl'>

<div>

<a href="#/xinwen">新闻</a>

<a href="#/ditu">地图</a>

<a href="#/shipin">视频</a>

<a href="#/tieba">贴吧</a>

<a href="#/yinyue/gequ">音乐</a>

</div>

<!-- 第二步:ngRoute渲染页面的容器 -->

<div ng-view></div>

</div>

</body>

<script src="js/angular.js"></script>

<!-- 第一步:需要引入ngRoute文件 -->

<script src="js/angular-route.js"></script>

<script>

// 第三步:这里需要引入ngRoute

angular.module('myapp',['ngRoute'])

// 第四步:写配置

.config(function($routeProvider){

// 配置路由信息

$routeProvider.when('/xinwen',{

template:'<h1>新闻页面{{msg}}</h1>',

controller:function($scope,$rootScope){

$scope.msg=',局部作用域'

$rootScope.$on('$routeChangeSuccess',function(){

console.log(this)

console.log(arguments)

})

}

})

.when('/ditu',{

templateUrl:'ditu.html',

controller:'dituCtrl'

})

.when('/shipin',{

template:'<h2>视频页面</h2>'

})

.when('/tieba',{

template:'<h3>贴吧页面</h3>'

})

.when('/yinyue/:song',{

templateUrl:'yinyue.html',

controller:function($scope,$routeParams){

console.log($routeParams);

$scope.song = $routeParams['song']

}

})

// 重定向

.otherwise({

redirectTo:'/xinwen'

})

})

.controller('myctrl',function($scope){})

// 定义地图控制器

.controller('dituCtrl',function($scope){

$scope.title='地图标题'

console.log($scope)

})

</script>

</html>

                     路由是通过哈希值实现查询的

                     动态路由:

                            When()方法中第一个参数可以这样来定义:

                                          When(‘/ditu/:num’,{})

                                   接收num

         路由事件:

                     路由一切换就会触发的一个事件

                     事件通过$on方法绑定,它需要绑定到根作用域上($rootScope)

              $rootScope.$on(‘$routeChangeSuccess’,function(){

                     Console.log(this)      //作用域是全局window

                     Console.log(arguments) //

})

       返回的参数有三个:

                     第一个参数:事件类型

                     第二个参数:当前页面的信息

                     第三个参数:上一个页面的信息

         UI路由:

       Angular中另一个路由,是由angular社区维护的,相对于指令路由,功能更丰富,可以实现多视图,可以实现子路由效果。

      

       这个路由使用时也需要引入。angular-ui-router.js文件

使用方法:

  1. 引入js文件
  2. 注入到angular中,Angular.module(‘myapp’,[‘ui.router’])
  3. 页面中定义盛放内容的容器<div ui-view> </div>
  4. 写配置,需要注入$stateProvider对象,这个对象上有一个方法,state()在这个方法上定义路由

通过config(function($startProvider){

               $stateprovider.state(‘名称’,{

               url:’路径’,

               template :‘字符串’,

               templateUrl:‘引入外部的html’,

               controller:function(){},

               controller:’xxCtrl’

})

})

.controller(‘xxCtrl’,function(){})

         Uirouter动态路由:

                     第一种形式:/movie/:num

                     第二种:、movie?page&siez

                     这种新式中的哦oage和size可传,可不传,页面都能访问

                     第三种形式:/movie/{num:ytpe}.

                            这种形式可以限制传入数的数据类型

                     第四种:/movie/:num?page

              Ui router 路由重定向

                     Ui router中不是使用$stateprovider 对象,而是需要传入一个新的对象$urlRouteProvider,

                     这个对象中有重定向方法,有俩个方法可用

  1. when() 方法:when(‘/list’,‘/movie/1’)
  2. Otherwise() 方法:otherwise(‘/yinyue/moren’)

         Ui router 路由事件

              $locationChangeSuccess

                     返回值有五个参数:

  1. 事件对象
  2. 当前页面
  3. 当前页面的动态数据
  4. 上一个页面
  5. 上个页面的数据

         Ui router加载多个视图.

                     Html中需要给渲染视图容器加标识 ui-view=‘值’

                     Js中需要通过views属性来定义要渲染的视图,根据标识符来渲染

                     Html页面部分

<Header ui-view=’heads’></header>

<div ui-view =’leftP’></div>

<div ui-view=’rightP’></div>

 

 

 

 

 

 

 

 

 

 

Js部分:

views:{

                     heads:{

                            template:heads,

                            controller:function(){}

                     },

                     leftP:{

                            template:'<h3>home的leftP部分</h3>'

                     },

                     rightP:{

                            template:'<h2>home的rightP部分</h2>'

                     }

              }

 

         Ui router子路由

             

// 路由

       $stateProvider

       .state('home',{

              url:'/home',

              template:'<h1 class="tit">home页面<div ui-view>详情</div></h1>'

       })

       // 子路由

       .state('home.detail',{

              url:'/detail',

              template:'<h2>详情页面</h2>'

       })

       .state('home.soso',{

              url:'/soso',

              template:'<h3>搜索页面</h3>'

       })

       // 重定向

       $urlRouterProvider

       .otherwise('/home')

})

 

 

 

 

$Location

       $location 是angular中提供的专门处理地址栏地址的服务

             

                     用法:调用方法时不传参数表示获取值

                                   传参数表示设置值

我们使用最多的是path方法,因为path方法修改的是哈希值,而angular的路由就是通过修改哈希值来实现的。

        自定义服务

                     Angular提供了俩种自定义服务的方法,

一种是:factory    是面向过程的定义,必须有返回值,返回值是对象, 不需要this

一种是:service      是面向对象的定义方法,一定不要有返回值,必须使用this

自定义的服务相当于在angular中定义一个全局的方法,可以在任何位置使用,哪里需要就在哪注入。

 

项目实际案例

              首先验证用户是否登录,如果登录过,显示用户名,如果没登录让用户登录

2、AngularJS的四个核心思想

       1)依赖注入

                     在定义您自己的控制器、指令、过滤器和动画的时候,我们必须使用模块系统

       2)模块化

Angular拥有非常吸引人的开发社区,海量免费的官方插件、第三方插件,如果我们要在应用中使用这些 库,我们就不得不用到模块系统

       3)双向绑定

Angular的模块系统提供了访问内部配置、插件配置的功能,我们将在最后一章配置自定义HTTP头的案例中演示后面一个特性

       4)语义化标签

 

 

 

 

 

3、AngularJs的优点

       1. 模板功能强大丰富,并且是声明式的,自带了丰富的Angular指令;

2. 是一个比较完善的前端MVC框架,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所有功能;

3. 自定义Directive(指令),比jQuery插件还灵活,但是需要深入了解Directive的一些特性,简单的封装容易,复杂一点官方没有提供详细的介绍文档,可以通过阅读源代码来找到某些我们需要的东西,如:在directive使用 $parse;

4. ng模块化比较大胆的引入了Java的一些东西(依赖注入),能够很容易的写出可复用的代码,对于敏捷开发的团队来说非常有帮助。


 [wd1]保留几位小数写几

 [wd2]Yyyy年MM月dd日 HH:mm:ss

 [wd3]Boolean值

猜你喜欢

转载自blog.csdn.net/weixin_37554325/article/details/82587262