AngularJS


第1章介绍

AngularJS是一款由Google公司开发维护的前端MVC框架,其克服HTML在构建应用上的诸多不足,从而降低了开发成本提升了开发效率。

1.1 特点

AngularJS与我们之前学习的jQuery是有一定的区别的,jQuery更准确来说只一个类库(类库指的是一系列函数的集合)以DOM做为驱动(核心),而AngularJS则一个框架(诸多类库的集合)以数据逻辑做为驱动(核心)。

框架对开发的流程和模式做了约束,开发者遵照约束进行开发,更注重的实际的业务逻辑。

AngularJS有着诸多特性,最为核心的是:模块化、双向数据绑定、语义化标签、依赖注入等。

与之类似的框架还有BackBone、KnockoutJS、Vue、React等。

1.2 下载

1、通过AngularJS官网下载,不过由于国内特殊的国情,需要FQ才能访问。

2、通过npm下载,npm install angular

3、通过bower下载,bower install angular

bower是什么?

1.3 体验AngularJS

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 介绍</title>
  6. <!-- 引入AngularJS 框架 -->
  7. <script src="./libs/angular.min.js"></script>
  8. </head>
  9. <body ng-app>
  10. <input type="text" ng-model="msg">
  11. <h2>你好: {{msg}}</h2>
  12. </body>
  13. </html>

1.4 MVC

MVC是一种开发模式,由模型(Model)、视图(View)、控制器(Controller)3部分构成,采用这种开发模式为合理组织代码提供了方便、降低了代码间的耦合度、功能结构清晰可见。

模型(Model)一般用来处理数据(读取/设置),一般指操作数据库。

视图(View)一般用来展示数据,比如通过HTML展示。

控制器(Controller)一般用做连接模型和视图的桥梁。

1054487-20161225193338464-184289692.png

 

通过ThinkPHP来演示后端MVC的执行流程,其重点在于理解。

MVC更多应用在后端开发程序里,后被引入到前端开发中,由于受到前端技术的限制便有了一些细节的调整,进而出现了很多MVC的衍生版(子集)如MVVM、MVW、MVP、MV*等。

注:做为初学可以不必过于在意这些概念。

mvc介绍.png

       1.在开发网站中,所有的功能其实都是前端人员发送请求并接受相应,然后将响应的数据放到页面中去。

   数据---->页面(对应数据要展示的对应页面),将处理数据的角色,称为模型(Model)。展示数据的角色称为视图(View)。为了保证对应的数据要展示到对应的页面上,需要分配,称为控制器(controller)。

   [MVC是一种开发的模式,采用这种开发模式可以使开发变得更加高效。]

        2.通过米快画的形式开发,每个模块下包括MVC,使用HTML在构建是变得灵活。

            2.1当引入angular.js后会提供一个全局对象angular,在此对象下有若干的方法,其次module方法可以创建模块 var App=angluar.module("App",[]);

            2.2每个模块包括MVC,模块实例也是一个对象,在此对象下有若干的方法,其次controller方法创建一个控制器,App.controller('Demo',['$scope',function($scope){}]);$scopr即模型(Model)

            2.3视图即HTML,每一个视图都隶属于某一个控制器,通过ng-controller进行指定,ng-controller="Demo"

第2章模块化

使用AngularJS构建应用(App)时是以模块化(Module)的方式组织的,即将整个应用划分成若干模块,每个模块都有各自的职责,最终组合成一个整体。

采用模块化的组织方式,可以最大程度的实现代码的复用,可以像搭积木一样进行开发。

1054487-20161225193339542-28400906.png

 

2.1 定义应用

通过为任一HTML标签添加ng-app属性,可以指定一个应用,表示此标签所包裹的内容都属于应用(App)的一部分。

1054487-20161225193340339-1354510616.jpg

 

2.2 定义模块

AngularJS提供了一个全局对象angular,在此全局对象下存在若干的方法,其中angular.module()方法用来定义一个模块。

1054487-20161225193340636-1501176502.jpg

 

注:应用(App)其本质也是一个模块(一个比较大的模块)。

2.3 定义控制器

控制器(Controller)作为连接模型(Model)和视图(View)的桥梁存在,所以当我们定义好了控制器以后也就定义好了模型和视图。

1054487-20161225193341511-2017929138.jpg

 

模型(Model)数据是要展示到视图(View)上的,所以需要将控制器(Controller)关联到视图(View)上,通过为HTML标签添加ng-controller属性并赋值相应的控制器(Controller)的名称,就确立了关联关系。

1054487-20161225193341807-1549236007.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AnguarJS 模块</title>
  6. <script src="./libs/angular.min.js"></script>
  7. <script>
  8. // 提供一个全局对象 angular
  9. // 在这个对象下有若干方法,可以实现具体功能
  10. // 其中module方法可以创建一个模块
  11. // 需要两个参数,第1个为模块名称,第2个为依赖(目前空数组)
  12. var App = angular.module('App', []);
  13. // 要完成功能还需要MVC
  14. // 上一步创建的模块其返回值App也是一个对象
  15. // 在此对象下又有若干方法,其中controller方法
  16. // 可以创建一个控制器
  17. App.controller('Demo', ['$scope', function ($scope) {
  18. // $scope 是一个空对象{}
  19. // 就是Model
  20. $scope.name = '你好 itcast';
  21. $scope.courses = ['html', 'css', 'js'];
  22. $scope.stars = [
  23. {name: '刘德华', age: 60, sex: '男', area: '香港'},
  24. {name: '王力宏', age: 39, sex: '男', area: '台湾'},
  25. {name: '周杰伦', age: 37, sex: '男', area: '台湾'}
  26. ];
  27. }]);
  28. // for(var i=0; i<courses.length; i++) {
  29. // courses[i]
  30. // }
  31. </script>
  32. </head>
  33. <body ng-app="App">
  34. <div class="box" ng-controller="Demo">
  35. <h1>{{name}}</h1>
  36. <ul>
  37. <li ng-repeat="i in courses">{{i}}</li>
  38. </ul>
  39. <table>
  40. <tr>
  41. <td>姓名</td>
  42. <td>性别</td>
  43. <td>年龄</td>
  44. <td>地区</td>
  45. </tr>
  46. <tr ng-repeat="star in stars">
  47. <td>{{star.name}}</td>
  48. <td>{{star.sex}}</td>
  49. <td>{{star.age}}</td>
  50. <td>{{star.area}}</td>
  51. </tr>
  52. </table>
  53. </div>
  54. </body>
  55. </html>

以上步骤就是AngularJS最基本的MVC工作模式。

下图是AngularJS的结构,学习AngularJS会围绕下图的结构展开。

1054487-20161225193342776-147315030.png

 

第3章指令

HTML在构建应用(App)时存在诸多不足之处,AngularJS通过扩展一系列的HTML属性或标签来弥补这些缺陷,所谓指令就是AngularJS自定义的HTML属性或标签,这些指令都是以ng-做为前缀的,例如ng-app、ng-controller、ng-repeat等。

3.1 内置指令

ng-app 指定应用根元素,至少有一个元素指定了此属性。

ng-controller 指定控制器

ng-show控制元素是否显示,true显示、false不显示

ng-hide控制元素是否隐藏,true隐藏、false不隐藏

ng-if控制元素是否“存在”,true存在、false不存在

ng-src增强图片路径

ng-href增强地址

ng-class控制类名

ng-include引入模板

ng-disabled表单禁用

ng-readonly表单只读

ng-checked单/复选框表单选中

ng-selected下拉框表单选中

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .red {
  8. color: red;
  9. }
  10. .blue {
  11. color: blue;
  12. }
  13. </style>
  14. <script src="./libs/angular.min.js"></script>
  15. </head>
  16. <body>
  17. <!-- <img src="./images/author.jpg" alt=""> -->
  18. <div ng-controller="DemoController">
  19. <link rel="stylesheet" ng-href="{{link}}">
  20. <p ng-show="false">学习使用ng-show指令,当属性值true时显示,否则隐藏</p>
  21. <p ng-hide="0">学习使用ng-hide指令,当属性值true时隐藏,否则显示</p>
  22. <p ng-if="1">学习使用ng-if指令,当属性值true时显示,否则隐藏</p>
  23. <img ng-src="{{path}}" alt="">
  24. <p class="{{color}}">一些文字</p>
  25. <p ng-class="{red: false, blue: true}">另一些文字</p>
  26. <form action="">
  27. <ul>
  28. <li>
  29. 姓名:<input type="text" value="itcast" ng-disabled="false">
  30. </li>
  31. <li>
  32. 地区:<input type="text" value="河北省" ng-readonly="true">
  33. </li>
  34. <li>爱好: 写代码<input type="checkbox" ng-checked="false"></li>
  35. <li>科目:
  36. <select name="" id="">
  37. <option value="0">PHP</option>
  38. <option value="0" ng-selected="false">前端</option>
  39. <option value="0">UI</option>
  40. </select>
  41. </li>
  42. </ul>
  43. </form>
  44. </div>
  45. <script>
  46. // ng-app 指定一个应用
  47. // 可以用应用任意标签上,并且将此标签包括区
  48. // 视为一个应用的范围
  49. // 一个页面可以有多个但是不能进行嵌套,一般指定一个
  50. var App = angular.module('App', []);
  51. // ng-controller 指定某视图隶属于某一个控制器
  52. App.controller('DemoController', ['$scope', function ($scope) {
  53. $scope.path = './images/author.jpg';
  54. $scope.link = './css/base.css';
  55. $scope.color = 'red';
  56. }]);
  57. </script>
  58. </body>
  59. </html>

注:后续学习过程中还会介绍其它指令。

3.2 自定义指令

AngularJS允许根据实际业务需要自定义指令,通过angular全局对象下的directive方法实现。

1054487-20161225193345292-770620605.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 自定义指令</title>
  6. <script src="./libs/angular.min.js"></script>
  7. <script>
  8. var App = angular.module('Demo', []);
  9. // 自定义控制器
  10. App.controller('ItcastController', ['$scope', function ($scope) {
  11. $scope.list = ['html', 'css', 'js'];
  12. }]);
  13. // 自定义指令
  14. // 第一个参数,指令的名称
  15. // 第二个参数,回调函数
  16. App.directive('itcast', function () {
  17. // 此回调函数指定具体指令应该做哪些事情
  18. // 通过一个对象来定义
  19. var obj = {
  20. // 自定义指令可以是属性可以是标签
  21. // E element
  22. // A attribute
  23. // C class
  24. // M mark
  25. restrict: 'ECMA',
  26. // 所有内容必须包含在一个根元素下
  27. template: '<div><h1>你好, AngularJS!</h1><p>哈哈</p></div>',
  28. // templateUrl: './header.html',
  29. replace: true,
  30. // scope: {},
  31. // link: function () {},
  32. // compile: function () {}
  33. }
  34. return obj;
  35. });
  36. </script>
  37. </head>
  38. <body ng-app="Demo">
  39. <div itcast></div>
  40. <itcast></itcast>
  41. <div class="itcast"></div>
  42. <!-- directive:itcast -->
  43. <ul ng-controller="ItcastController">
  44. <li ng-repeat="item in list">{{item}}</li>
  45. </ul>
  46. </body>
  47. </html>

第4章数据绑定

AngularJS是以数据做为驱动的MVC框架,所有模型(Model)里的数据经由控制器(Controller)展示到视图(View)中。

所谓数据绑定指的就是将模型(Model)中的数据与相应的视图(View)进行关联,分为单向绑定和双向绑定两种方式。

4.1 单向绑定

单向数据绑定是指将模型(Model)数据,按着写好的视图(View)模板生成HTML标签,然后追加到DOM中显示,如之前所学的artTemplate 模板引擎的工作方式。

如下图所示,只能模型(Model)数据向视图(View)传递。

1054487-20161225193345761-547662635.jpg

 

4.2 双向绑定

双向绑定则可以实现模型(Model)数据和视图(View)模板的双向传递,如下图所示。

1054487-20161225193346151-2058568064.jpg

 

4.3 相关指令

在AngularJS中通过“{{}}”和ng-bind指令来实现模型(Model)数据向视图模板(View)的绑定,模型数据通过一个内置服务$scope来提供,这个$scope是一个空对象,通过为这个对象添加属性或者方法便可以在相应的视图(View)模板里被访问。

注:“{{}}”是ng-bind的简写形式,其区别在于通过“{{}}”绑定数据时会有“闪烁”现象,添加ng-cloak也可以解决“闪烁”现象,通过ng-bind-template可以绑定多个数据。

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 数据绑定</title>
  6. <script src="./libs/angular.min.js"></script>
  7. </head>
  8. <body ng-app="Demo">
  9. <div class="box" ng-controller="DemoController">
  10. <!-- <h1 ng-cloak>{{name}}<small ng-bind="age"></small></h1> -->
  11. <!-- <h1>{{name}}{{age}}</h1> -->
  12. <h1 ng-bind-template="{{name}}{{age}}"></h1>
  13. <ul>
  14. <li ng-repeat="course in courses">{{course}}</li>
  15. </ul>
  16. </div>
  17. <script>
  18. var App = angular.module('Demo', []);
  19. App.controller('DemoController', ['$scope', function ($scope) {
  20. $scope.name = '小明';
  21. $scope.age = '18';
  22. $scope.courses = ['html', 'css', 'js'];
  23. }]);
  24. </script>
  25. </body>
  26. </html>

通过为表单元素添加ng-model指令实现视图(View)模板向模型(Model)数据的绑定。

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 数据绑定</title>
  6. <script src="./libs/angular.min.js"></script>
  7. <script>
  8. var App = angular.module('App', []);
  9. App.controller('DemoController', ['$scope', function ($scope) {
  10. $scope.msg = '你好!!!!!';
  11. $scope.testmsg = '';
  12. $scope.show = function () {
  13. // 可以输出模型数据
  14. alert($scope.msg);
  15. // alert($scope.testmsg);
  16. }
  17. }]);
  18. </script>
  19. </head>
  20. <body ng-app="App">
  21. <div ng-controller="DemoController">
  22. <h3>{{msg}}</h3>
  23. <input type="text" ng-model="testmsg">
  24. <h4>{{testmsg}}</h4>
  25. <button ng-click="show()">显示</button>
  26. </div>
  27. </body>
  28. </html>

通过ng-init可以初始化模型(Model)也就是$scope。

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 数据绑定</title>
  6. </head>
  7. <body>
  8. <div ng-controller="DemoController" ng-init="name='小明'; age=18">
  9. <h1>{{name}}</h1>
  10. <small>{{age}}</small>
  11. </div>
  12. <script src="./libs/angular.min.js"></script>
  13. <script>
  14. var App = angular.module('App', []);
  15. App.controller('DemoController', ['$scope', function ($scope) {
  16. // $scope.name = "小明";
  17. }]);
  18. </script>
  19. </body>
  20. </html>

AngularJS对事件也进行了扩展,无需显式的获取DOM元素便可以添加事件,易用性变的更强。通过在原有事件名称基础上添加ng-做为前缀,然后以属性的形式添加到相应的HTML标签上即可。如ng-clickng-dblclickng-blur等。

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 数据绑定</title>
  6. <style>
  7. ul {
  8. list-style: none;
  9. }
  10. .mouseover {
  11. width: 100px;
  12. height: 100px;
  13. background-color: pink;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <div ng-controller="DemoController">
  19. <ul>
  20. <li>{{name}}</li>
  21. <li><button ng-click="myclick()">点击</button></li>
  22. <li class="mouseover" ng-mouseout="mymouseout()" ng-mouseover="mymouseover()"></li>
  23. <li><input type="text" ng-keydown="mykeydown()"></li>
  24. </ul>
  25. </div>
  26. <script src="./libs/angular.min.js"></script>
  27. <script>
  28. var App = angular.module('App', []);
  29. App.controller('DemoController', ['$scope', function ($scope) {
  30. $scope.name = '小明';
  31. $scope.myclick = function () {
  32. alert('点击了一下?');
  33. }
  34. $scope.mymouseover = function () {
  35. console.log('鼠标经过过?');
  36. }
  37. $scope.mymouseout = function () {
  38. console.log('鼠标离开了?');
  39. }
  40. $scope.mykeydown = function () {
  41. console.log('按键被按下');
  42. }
  43. }]);
  44. </script>
  45. </body>
  46. </html>

通过ng-repeat可以将数组或对象数据迭代到视图模板中,ng-switch、on、ng-switch-when可以对数据进行筛选。

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 数据绑定</title>
  6. </head>
  7. <body>
  8. <div ng-controller="DemoController">
  9. <ul>
  10. <li ng-repeat="val in obj">{{val}}</li>
  11. </ul>
  12. <ul>
  13. <li ng-repeat="val in courses" ng-switch on="val">
  14. <span ng-switch-when="css">{{val}}</span>
  15. </li>
  16. </ul>
  17. </div>
  18. <script src="./libs/angular.min.js"></script>
  19. <script>
  20. var App = angular.module('App', []);
  21. App.controller('DemoController', ['$scope', function ($scope) {
  22. $scope.obj = {
  23. name: '小明',
  24. age: 18
  25. }
  26. $scope.courses = ['html', 'css', 'js'];
  27. }]);
  28. var arr = ['html', 'css', 'js'];
  29. for(var i=0; i<arr.length; i++) {
  30. if(arr[i] == 'css') {
  31. console.log(arr[i])
  32. }
  33. }
  34. // switch($str) {
  35. // case 'css':
  36. // console.log($str);
  37. // break;
  38. // case 'js'
  39. // }
  40. </script>
  41. </body>
  42. </html>
数据绑定.png

第5章作用域

通常AngularJS中应用(App)是由若干个视图(View)组合成而成的,而视图(View)又都是HTML元素,并且HTML元素是可以互相嵌套的,另一方面视图都隶属于某个控制器(Controller),进而控制器之间也必然会产生嵌套关系。

每个控制器(Controller)又都对应一个模型(Model)也就是$scope对象,不同层级控制器(Controller)下的$scope便产生了作用域。

5.1 根作用域

一个AngularJS的应用(App)在启动时会自动创建一个根作用域$rootScope,这个根作用域在整个应用范围(ng-app所在标签以内)都是可以被访问到的。

1054487-20161225193347198-176318429.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <script src="./libs/angular.min.js"></script>
  7. <script>
  8. var App = angular.module('App', []);
  9. //
  10. App.controller('ParentController', ['$scope', function ($scope) {
  11. // $scope.name = '康熙';
  12. }]);
  13. App.controller('ChildController', ['$scope', function ($scope) {
  14. // $scope.name = '雍正';
  15. }]);
  16. var a = 10;
  17. function fn() {
  18. // a = 15;
  19. alert(a);
  20. function bar() {
  21. // a = 20;
  22. alert(a);
  23. }
  24. bar();
  25. }
  26. fn();
  27. </script>
  28. </head>
  29. <body>
  30. <div class="box" ng-app="App" ng-init="name='顺治'">
  31. <div class="parent" ng-controller="ParentController">
  32. <dl>
  33. <dt>{{name}}</dt>
  34. <dd></dd>
  35. </dl>
  36. <div class="child" ng-controller="ChildController">
  37. <dl>
  38. <dt>---{{name}}</dt>
  39. <dd></dd>
  40. </dl>
  41. </div>
  42. </div>
  43. </div>
  44. </body>
  45. </html>

5.2 子作用域

通过ng-controller指令可以创建一个子作用域,新建的作用域可以访问其父作用域的数据。

第6章过滤器

在AngularJS中使用过滤器格式化展示数据,在“{{}}”中使用“|”来调用过滤器,使用“:”传递参数。

6.1 内置过滤器

1、currency将数值格式化为货币格式

2、date日期格式化,年(y)、月(M)、日(d)、星期(EEEE/EEE)、时(H/h)、分(m)、秒(s)、毫秒(.sss),也可以组合到一起使用。

3、filter在给定数组中选择满足条件的一个子集,并返回一个新数组,其条件可以是一个字符串、对象、函数

4、json将Javascrip对象转成JSON字符串。

5、limitTo取出字符串或数组的前(正数)几位或后(负数)几位

6、lowercase将文本转换成小写格式

7、uppercase将文本转换成大写格式

8、number数字格式化,可控制小位位数

9、orderBy对数组进行排序,第2个参数可控制方向

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 过滤器</title>
  6. </head>
  7. <body ng-app="App">
  8. <ul ng-controller="DemoController">
  9. <li>当前时间为: {{now|date:'y-M-d hh:mm:ss'}}</li>
  10. <li>商品价格: {{price|currency:'¥':4}}</li>
  11. <li>你叫啥: {{desc|uppercase}}</li>
  12. <li>年龄: {{age|lowercase}}</li>
  13. <li>数值: {{num|number:3}}</li>
  14. <li>转JSON: {{obj|json}}</li>
  15. <li>截取: {{desc|limitTo:-4}}</li>
  16. <li>截取: {{items|limitTo:2:3}}</li>
  17. <li>排序: {{students|orderBy:'score':false}}</li>
  18. <li>过滤: {{students|filter:'小明'}}</li>
  19. <li>过滤: {{students|filter:{name:'小牛'} }}</li>
  20. <li>过滤: {{courses|filter: 'p'}}</li>
  21. </ul>
  22. <script src="./libs/angular.min.js"></script>
  23. <script>
  24. var App = angular.module('App', []);
  25. App.controller('DemoController', ['$scope', function ($scope) {
  26. $scope.now = new Date;
  27. $scope.price = 12.345;
  28. $scope.desc = 'my name is xiaoming';
  29. $scope.age = 'HOw Old are you?';
  30. $scope.num = 123.4567;
  31. $scope.obj = {name: '小明', age: 18};
  32. $scope.items = ['html', 'css', 'js', 'php', 'java'];
  33. $scope.students = [
  34. {name: '小明', age: 18, score: 99},
  35. {name: '小红', age: 16, score: 96},
  36. {name: '小牛', age: 19, score: 97}
  37. ];
  38. $scope.courses = ['php', 'java', 'javascript', 'photoshop'];
  39. }])
  40. </script>
  41. </body>
  42. </html>

6.2 自定义过滤器

除了使用AngularJS内建过滤器外,还可以根业务需要自定义过滤器,通过模块对象实例提供的filter方法自定义过滤器。

1054487-20161225193347792-1232324131.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 自定义过滤器</title>
  6. <script src="./libs/angular.min.js"></script>
  7. <script>
  8. var App = angular.module('App', []);
  9. // 定义控制器
  10. App.controller('DemoController', ['$scope', function ($scope) {
  11. $scope.str = '测试内容';
  12. $scope.price = 12.345;
  13. $scope.desc = 'my name is laozhao';
  14. }]);
  15. // 定义指令
  16. // App.directive();
  17. // 定义过滤器
  18. // 过滤器本质就一个函数
  19. // 第1个参数为过滤器名称(函数名称)
  20. // 第2个参数为回调函数
  21. App.filter('demo', function () {
  22. // 在此定义过滤器具体的功能
  23. // function abc() {
  24. // console.log('1111');
  25. // }
  26. // return abc;
  27. return function (arg, type, fixed) {
  28. // return arg + arg2 + arg3;
  29. return type + arg.toFixed(fixed);
  30. }
  31. });
  32. // 自定义一个实英文首字母大定的过滤器
  33. App.filter('capitalize', function () {
  34. return function (input) {
  35. console.log(input);
  36. return input[0].toUpperCase() + input.slice(1);
  37. }
  38. });
  39. </script>
  40. </head>
  41. <body ng-app="App">
  42. <div ng-controller="DemoController">
  43. <dl>
  44. <dt>自定义过滤器</dt>
  45. <dd>{{price|demo:'¥':2}}</dd>
  46. <dd>{{desc|capitalize}}</dd>
  47. </dl>
  48. </div>
  49. </body>
  50. </html>

第7章依赖注入

AngularJS采用模块化的方式组织代码,将一些通用逻辑封装成一个对象或函数,实现最大程度的复用,这导致了使用者和被使用者之间存在依赖关系。

所谓依赖注入是指在运行时自动查找依赖关系,然后将查找到依赖传递给使用者的一种机制。

常见的AngularJS内置服务有$http、$location、$timeout、$rootScope等

7.1 推断式注入

没有明确声明依赖,AngularJS会将函数参数名称当成是依赖的名称。

1054487-20161225193348182-1771853306.jpg

 

这种方式会带来一个问题,当代码经过压缩后函数的参数被压缩,这样便会造成依赖无法找到。

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 依赖注入</title>
  6. </head>
  7. <body ng-app="App">
  8. <div class="box" ng-controller="DemoController">
  9. <h1>{{name}}</h1>
  10. </div>
  11. <script src="./libs/angular.min.js"></script>
  12. <script>
  13. var App = angular.module('App', []);
  14. // AngularJS 内置一些具有特殊功能的“模块”
  15. // 开发者在开发的时候可以直接使用这些“模块”
  16. App.controller('DemoController', function ($scope, $http) {
  17. $scope.name = '推断式';
  18. });
  19. </script>
  20. </body>
  21. </html>

7.2 行内注入

以数组形式明确声明依赖,数组元素都是包含依赖名称的字符串,数组最后一个元素是依赖注入的目标函数。

1054487-20161225193348464-63983271.jpg

 

推荐使用这种方式声明依赖

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 依赖注入</title>
  6. <script src="./libs/angular.min.js"></script>
  7. <script>
  8. var App = angular.module('App', []);
  9. // 写一个控制器
  10. // $scope 就是AngularJS 事件提供供的一个功能模块
  11. // 数组是用来声明需要依赖哪些功能模块的
  12. // 数组最后一个单元必须为函数,函数的参数即注入
  13. // angularJS将查找得到的功能模块以参数的形式传入
  14. // 最后一个数组单元传递的函数,这个过程称为注入
  15. // 行内式依赖注入
  16. App.controller('DemoController', ['$scope', '$http', '$rootScope', function ($scope, $http, $rootScope) {
  17. $scope.name = '依赖注入';
  18. }]);
  19. // 依赖注入并非只能用于定义控制器时,
  20. // 只是我们目前接触控制器最多,拿它举例说明
  21. </script>
  22. </head>
  23. <body ng-app="App">
  24. <div ng-controller="DemoController">
  25. <h1>{{name}}</h1>
  26. </div>
  27. </body>
  28. </html>

第8章服务

服务是一个对象或函数,对外提供特定的功能。

8.1 内建服务

1、$location是对原生Javascript中location对象属性和方法的封装。

        $location是关于链接的操作,hash是特殊的,#号后面的都封装成hash了,方便调用别的方法。

1054487-20161225193348761-1381920402.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 服务</title>
  6. </head>
  7. <body>
  8. <dl ng-controller="DemoController">
  9. <dt>$location服务</dt>
  10. <a href="#/abc?name=itcast&age=10#hash">地址</a>
  11. <dd>absUrl: {{absUrl}}</dd>
  12. <dd>host: {{host}}</dd>
  13. <dd>port: {{port}}</dd>
  14. <dd>hash: {{hash}}</dd>
  15. <dd>search: {{search}}</dd>
  16. <dd>protocol: {{protocol}}</dd>
  17. </dl>
  18. <script src="./libs/angular.min.js"></script>
  19. <script>
  20. var App = angular.module('App', []);
  21. // $location内置服务
  22. // AngularJS 专门提供了一个帮助获取URL地址一个服务
  23. App.controller('DemoController', ['$scope', '$location', function ($scope, $location) {
  24. console.log($location);
  25. // 获取绝对路径
  26. $scope.absUrl = $location.absUrl();
  27. $scope.host = $location.host();
  28. $scope.port = $location.port();
  29. // angularjs 对hash做了特别的处理
  30. $scope.hash = $location.hash();
  31. $scope.search = $location.search();
  32. $scope.protocol = $location.protocol();
  33. }]);
  34. // 一个完整地址是包括若干部分的
  35. // http://www.baidu.com:80
  36. // http://localhost/02day/4-code/$http.html
  37. // http://localhost/02day/4-code/$http.html?name=小明&age=10
  38. // http://localhost/02day/4-code/$http.html#demo
  39. // http 表示协议
  40. // localhost/127.0.0.1/www.baidu.com 表示主机
  41. // 80 表示端口号
  42. // # 表示锚链接
  43. // ? 表示查询参数或叫queryString
  44. // 02day/4-code 表示pathname
  45. // js BOM 提供了一个对象 location 可以获取地址的任一部分
  46. for(var key in location) {
  47. console.log(key + '~~~' + location[key]);
  48. }
  49. </script>
  50. </body>
  51. </html>

2、$timeout&$interval对原生Javascript中的setTimeout和setInterval进行了封装。

        $timeout是等待多久后执行,$interval是间歇执行。

         清除定时器:$interval.cancel(interval赋值的变量)。

1054487-20161225193349276-2099810892.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 服务</title>
  6. </head>
  7. <body>
  8. <div ng-controller="DemoController">
  9. <ul>
  10. <li>{{msg}}</li>
  11. <li>{{count}}</li>
  12. <li>{{now|date:'yyyy-MM-dd hh:mm:ss'}}</li>
  13. <li><button ng-click="start()">开始计时</button></li>
  14. <li><button ng-click="stop()">停止计时</button></li>
  15. </ul>
  16. </div>
  17. <script src="./libs/angular.min.js"></script>
  18. <script>
  19. var App = angular.module('App', []);
  20. // $timeout 和 $interval
  21. App.controller('DemoController', ['$scope', '$timeout', '$interval',function ($scope, $timeout, $interval) {
  22. // $timeout(function () {
  23. // $scope.msg = '我在1秒后显示';
  24. // }, 1000);
  25. // var count = 0;
  26. // $interval(function () {
  27. // $scope.count = count++;
  28. // }, 500);
  29. var timer;
  30. $scope.start = function () {
  31. timer = $interval(function () {
  32. $scope.now = new Date;
  33. }, 1000);
  34. }
  35. $scope.stop = function () {
  36. // 清
  37. $interval.cancel(timer);
  38. }
  39. }])
  40. </script>
  41. </body>
  42. </html>

3、$filter过滤器在控制器中格式化数据,用来处理数据格式的。

1054487-20161225193349745-1380792195.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 服务</title>
  6. </head>
  7. <body>
  8. <ul ng-controller="DemoController">
  9. <li>价格: {{price}}</li>
  10. <li>大写: {{intro}}</li>
  11. <li>截取: {{list}}</li>
  12. </ul>
  13. <script src="./libs/angular.min.js"></script>
  14. <script>
  15. var App = angular.module('App', []);
  16. // 前面学习过滤器,主要应用在{{}}中
  17. // 但是也会有需求,在控制器中使用,这时需要用到一个
  18. // 叫$filter的服务
  19. // $filter是过滤器
  20. App.controller('DemoController', ['$scope', '$filter', function ($scope, $filter) {
  21. // $filter服务仍然是处理数据格式的
  22. var price = 12.345; // ¥12.345;
  23. var currency = $filter('currency');
  24. $scope.price = currency(price, '¥', 3);
  25. var intro = 'my name is laozhao';
  26. var uppercase = $filter('uppercase');
  27. $scope.intro = uppercase(intro);
  28. var list = ['html', 'css', 'js'];
  29. var limitTo = $filter('limitTo');
  30. $scope.list = limitTo(list, 2);
  31. }])
  32. </script>
  33. </body>
  34. </html>

4、$log打印调试信息

1054487-20161225193350167-821564912.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 服务</title>
  6. <script src="./libs/angular.min.js"></script>
  7. <script>
  8. var App = angular.module('App', []);
  9. // $scope是一个具有特定功能的模块
  10. // 在AngularJS中将具有特定功能的模块称为服务
  11. App.controller('DemoController', ['$scope', '$log', function ($scope, $log) {
  12. // $scope 是一个AngularJS内置服务,可以充当模型这个角色
  13. $scope.name = '小明';
  14. // $log是一个内置的服务,可以帮助开发者在开发阶段进行调试
  15. $log.debug('调试信息');
  16. $log.info('信息');
  17. $log.log('打印');
  18. $log.error('错误');
  19. $log.warn('警告');
  20. }]);
  21. </script>
  22. </head>
  23. <body ng-app="App">
  24. <div ng-controller="DemoController">
  25. <h1>{{name}}</h1>
  26. </div>
  27. </body>
  28. </html>

5、$http用于向服务端发起异步请求。

1054487-20161225193350620-101187534.jpg

 

同时还支持多种快捷方式如$http.get()、$http.post()、$http.jsonp。

注:各参数含义见代码注释。

GET:

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS $http服务</title>
  6. </head>
  7. <body ng-app="App">
  8. <div ng-controller="DemoController">
  9. <h1>练习$http</h1>
  10. </div>
  11. <script src="./libs/angular.min.js"></script>
  12. <script>
  13. var App = angular.module('App', []);
  14. App.controller('DemoController', ['$http', '$log', function ($http, $log) {
  15. // $http 是angularJS内置服务,可以向服务器发起异步请求
  16. $http({
  17. url: './example.php', // 请求地址
  18. method: 'get', // 请求方式
  19. params: {sex: '男'}, // 专门用来传递get形式的参数
  20. // AngularJS 以get形式传参时,并没有使用data
  21. data: 'name=小明&age=10' // 专门用来传post形式的参数
  22. }).success(function (info) { // 响应成功后会执行
  23. // info 即服务端返回的数据
  24. $log.info(info);
  25. });
  26. }]);
  27. // XMLHttpRequest
  28. // var xhr = new XMLHttpRequest;
  29. // xhr.open('post', './example.php');
  30. // xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  31. // 之所以在jQuery可以通data以对象形式传递参数
  32. // 是因jQuery内部进行处理(key=val&key1=val1)
  33. // 之所以在jQuery中传递参数不论get或post都可以使用
  34. // data传递,是因为在jQuery内部做了判断将参数放到不同位置了
  35. // 标准格式 key=val&key1=val1
  36. // xhr.send('name=小明&age=10');
  37. // $.ajax({
  38. // url: './example.php',
  39. // type: 'post',
  40. // data: {name: 'itcast', age: 10}
  41. // })
  42. </script>
  43. </body>
  44. </html>
POST:
 
   
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS $http服务</title>
  6. </head>
  7. <body ng-app="App">
  8. <div ng-controller="DemoController">
  9. <h1>练习$http</h1>
  10. </div>
  11. <script src="./libs/angular.min.js"></script>
  12. <script>
  13. var App = angular.module('App', []);
  14. App.controller('DemoController', ['$http', '$log', function ($http, $log) {
  15. // $http 是angularJS内置服务,可以向服务器发起异步请求
  16. $http({
  17. url: './example.php', // 请求地址
  18. method: 'post', // 请求方式
  19. // angularJS没有将一个对象数据转换成
  20. // key=val&key1=val1
  21. // data: {name: '小明', age: 18}, // 传递参数
  22. data: 'name=小明&age=10',
  23. headers: {
  24. 'Content-Type': 'application/x-www-form-urlencoded'
  25. }
  26. }).success(function (info) { // 响应成功后会执行
  27. // info 即服务端返回的数据
  28. $log.info(info);
  29. });
  30. }]);
  31. // XMLHttpRequest
  32. // var xhr = new XMLHttpRequest;
  33. // xhr.open('post', './example.php');
  34. // xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  35. // 之所以在jQuery可以通data以对象形式传递参数
  36. // 是因jQuery内部进行处理(key=val&key1=val1)
  37. // 标准格式 key=val&key1=val1
  38. // xhr.send('name=小明&age=10');
  39. // $.ajax({
  40. // url: './example.php',
  41. // type: 'post',
  42. // data: {name: 'itcast', age: 10}
  43. // })
  44. </script>
  45. </body>
  46. </html>
JSONP:
 
    
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS $http服务</title>
  6. </head>
  7. <body ng-app="App">
  8. <div ng-controller="DemoController">
  9. <h1>练习$http</h1>
  10. </div>
  11. <script src="./libs/angular.min.js"></script>
  12. <script>
  13. var App = angular.module('App', []);
  14. App.controller('DemoController', ['$http', '$log', function ($http, $log) {
  15. $http({
  16. url: './jsonp.php',
  17. method: 'jsonp', // 使用JSONP请求
  18. // JSON原理中需要将前端“事先”定义好的一个函数名
  19. // 传递给后端,后在返回这个函数调用(函数名())
  20. // 并且在调用时传递一个实参,通过这种方式可以间接
  21. // 获取服务端数据
  22. // 类似这种格式值angular.callbacks._0被添加到了
  23. // 请求后面,angular.callbacks._0就是angularjs事先定义好的一个函数名字
  24. // angular.callbacks._0();
  25. params: {callback: 'JSON_CALLBACK'}
  26. }).success(function (info) {
  27. $log.info(info);
  28. });
  29. // $.ajax({
  30. // url: '',
  31. // dataType: 'jsonp',
  32. // success: function (info) {
  33. // }
  34. // });
  35. }]);
  36. </script>
  37. </body>
  38. </html>


8.2 自定义服务

通过上面例子得知,所谓服务是将一些通用性的功能逻辑进行封装方便使用,AngularJS允许将自定义服务。

1054487-20161225193351229-1032586339.jpg

 

1、factory方法

1054487-20161225193351526-1579235280.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 自定义服务</title>
  6. </head>
  7. <body>
  8. <div ng-controller="DemoController">
  9. <span>{{now}}</span>
  10. <button ng-click="show()">显示时间</button>
  11. </div>
  12. <script src="./libs/angular.min.js"></script>
  13. <script>
  14. var App = angular.module('App', []);
  15. // App.directive(); 自定义指令
  16. // App.filter(); 自定义过滤器
  17. // App.controller(); “自定义”控制器
  18. // App.factory(); 自定义服务
  19. // 定义一个名叫showTime的服务
  20. App.factory('showTime', ['$filter', function ($filter) {
  21. function show() {
  22. // 当外部调用show方法时
  23. // 将结果返回
  24. return $filter('date')(new Date, 'yyyy-MM-dd hh:mm:ss');
  25. }
  26. // 将封装好的服务返回,供外部使用
  27. // 可以以对象形式也可以直接返回函数
  28. // return show
  29. // 或者
  30. return {
  31. show: show
  32. }
  33. }]);
  34. // 定义一个控制器,将自定义的服务注入进来
  35. // 测试
  36. App.controller('DemoController', ['$scope', 'showTime', function ($scope, showTime) {
  37. // showTime就是自定义的服务
  38. $scope.show = function () {
  39. // 当我们自定义的服务返回一个对象时
  40. // 使用 showTime.show()
  41. // $scope.now = showTime.show();
  42. // 当我们自定义的服务直接返回函数时
  43. // 使用showTime();
  44. $scope.now = showTime();
  45. };
  46. }]);
  47. </script>
  48. </body>
  49. </html>

2、service方法

1054487-20161225193351979-91519657.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 自定义服务</title>
  6. </head>
  7. <body>
  8. <div ng-controller="DemoController">
  9. <h1>{{now}}</h1>
  10. </div>
  11. <script src="./libs/angular.min.js"></script>
  12. <script>
  13. var App = angular.module('App', []);
  14. // 自定义服务
  15. // 通过 servie定义一个服务
  16. // 第1个参数是自定义服务名称
  17. // 第2个参数是依赖注入
  18. App.service('showTime', ['$filter', function ($filter) {
  19. // 将定义好的服务添加到this对象上
  20. // 外部就可以使用了
  21. // $filter可以直接拿来用
  22. this.show = function (format) {
  23. return $filter('date')(new Date, format);
  24. }
  25. }]);
  26. // 自定义一个控制器,测试自定义服务
  27. App.controller('DemoController', ['$scope', 'showTime', function ($scope, showTime) {
  28. $scope.now = showTime.show('MM');
  29. }])
  30. </script>
  31. </body>
  32. </html>

3、value方法定义常量

1054487-20161225193352276-1418395791.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 自定义服务</title>
  6. </head>
  7. <body>
  8. <div ng-controller="DemoController">
  9. {{author}}
  10. {{version}}
  11. </div>
  12. <script src="./libs/angular.min.js"></script>
  13. <script>
  14. var App = angular.module('App', []);
  15. // 自定义常量服务
  16. App.value('author', 'itcast');
  17. App.value('version', '1.0');
  18. // 本质上一个服务
  19. // 从表现形式上是一个常量
  20. // 常量就是不变的值与变对量相对应
  21. // 声明依赖调用服务
  22. App.controller('DemoController', ['$scope', 'author', 'version', function ($scope, author, version) {
  23. $scope.author = author;
  24. $scope.version = version;
  25. }])
  26. </script>
  27. </body>
  28. </html>

在介绍服务时曾提到服务本质就是一个对象或函数,所以自定义服务就是要返回一个对象或函数以供使用。

第9章模块加载

AngularJS模块可以在被加载或者执行之前对其自身进行配置。我们可以在应用的加载阶段配置不同的逻辑。

1054487-20161225193352651-1786580191.jpg

 

9.1 配置块

1、通过config方法实现对模块的配置,AngularJS中的服务大部分都对应一个“provider”,用来执行与对应服务相同的功能或对其进行配置。

比如$log、$http、$location都是内置服务,相对应的“provider”分别是$logProvider、$httpProvider、$locationPorvider。

下图以$log为例进行演示,修改了配置

1054487-20161225193352979-431948409.jpg

 

下图以$filter为例进行演示,实现相同功能

1054487-20161225193353370-218048915.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 服务</title>
  6. </head>
  7. <body>
  8. <ul ng-controller="DemoController">
  9. <li>价格: {{price}}</li>
  10. <li>大写: {{intro}}</li>
  11. <li>截取: {{list}}</li>
  12. </ul>
  13. <script src="./libs/angular.min.js"></script>
  14. <script>
  15. var App = angular.module('App', []);
  16. // 前面学习过滤器,主要应用在{{}}中
  17. // 但是也会有需求,在控制器中使用,这时需要用到一个
  18. // 叫$filter的服务
  19. // $filter是过滤器
  20. App.controller('DemoController', ['$scope', '$filter', function ($scope, $filter) {
  21. // $filter服务仍然是处理数据格式的
  22. var price = 12.345; // ¥12.345;
  23. var currency = $filter('currency');
  24. $scope.price = currency(price, '¥', 3);
  25. var intro = 'my name is laozhao';
  26. var uppercase = $filter('uppercase');
  27. $scope.intro = uppercase(intro);
  28. var list = ['html', 'css', 'js'];
  29. var limitTo = $filter('limitTo');
  30. $scope.list = limitTo(list, 2);
  31. }])
  32. </script>
  33. </body>
  34. </html>

9.2 运行块

服务也是模块形式存在的对且对外提供特定功能,前面学习中都是将服务做为依赖注入进去的,然后再进行调用,除了这种方式外我们也可以直接运行相应的服务模块,AngularJS提供了run方法来实现。

rootScope根作用域(相当于window)

1054487-20161225193353792-861994454.jpg

 

不但如此,run方法还是最先执行的,利用这个特点我们可以将一些需要优先执行的功能通过run方法来运行,比如验证用户是否登录,未登录则不允许进行任何其它操作。

 
  
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="App" ng-init="name='顺治'">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 模块加载</title>
  6. </head>
  7. <body>
  8. <div ng-controller="DemoController">
  9. {{name}}
  10. {{age}}
  11. </div>
  12. <script src="./libs/angular.min.js"></script>
  13. <script>
  14. var App = angular.module('App', []);
  15. // 在AngularJS中某些模块是可以直接运行的
  16. // 使用 App.run()
  17. // 例如直接运行$http、$rootScope服务
  18. // $rootScope根作域(相当于window)
  19. App.run(['$http', '$rootScope', function ($http, $rootScope) {
  20. // 定义全局作用域
  21. $rootScope.name = '顺治';
  22. $rootScope.age = '28';
  23. // 利用$http发送异步请求
  24. $http({
  25. url: './example.php'
  26. }).success(function (info) {
  27. console.log(info);
  28. });
  29. }]);
  30. // 定义制器测试全局作用域
  31. App.controller('DemoController', ['$scope', function ($scope) {
  32. // $scope.name = '康熙';
  33. }])
  34. </script>
  35. </body>
  36. </html>

注:此知识点意在了解AngularJS的加载机制。

第10章路由

一个应用是由若个视图组合而成的,根据不同的业务逻辑展示给用户不同的视图,路由则是实现这一功能的关键。

10.1 SPA

SPA(Single Page Application)指的是通单一页面展示所有功能,通过Ajax动态获取数据然后进行实时渲染,结合CSS3动画模仿原生App交互,然后再进行打包(使用工具把Web应用包一个壳,这个壳本质上是浏览器)变成一个“原生”应用。

在PC端也有广泛的应用,通常情况下使用Ajax异步请求数据,然后实现内容局部刷新,局部刷新的本质是动态生成DOM,新生成的DOM元素并没有真实存在于文档中,所以当再次刷新页面时新添加的DOM元素会“丢失”,通过单页面应可以很好的解决这个问题。

10.2 路由(约等于地址)前端路由就是封装了锚链接

在后端开发中通过URL地址可以实现页面(视图)的切换,但是AngularJS是一个纯前端MVC框架,在开发单页面应用时,所有功能都在同一页面完成,所以无需切换URL地址(即不允许产生跳转),但Web应用中又经常通过链接(a标签)来更新页面(视图),当点击链接时还要阻止其向服务器发起请求,通过锚点(页内跳转)可以实现这一点。

实现单页面应用需要具备:

a、只有一页面

b、链接使用锚点

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 路由和多视图</title>
  6. <style>
  7. body {
  8. padding: 0;
  9. margin: 0;
  10. background-color: #F7F7F7;
  11. font-family: Arial;
  12. }
  13. .wrapper {
  14. width: 980px;
  15. margin: 50px auto;
  16. }
  17. ul {
  18. padding: 0;
  19. margin: 0;
  20. overflow: hidden;
  21. list-style: none;
  22. background-color: #000;
  23. border-radius: 4px;
  24. }
  25. li {
  26. float: left;
  27. width: 120px;
  28. height: 40px;
  29. text-align: center;
  30. line-height: 40px;
  31. font-size: 18px;
  32. }
  33. li.active {
  34. background-color: #333;
  35. }
  36. li a {
  37. display: block;
  38. color: #FFF;
  39. text-decoration: none;
  40. }
  41. .content {
  42. margin-top: 30px;
  43. font-size: 24px;
  44. padding: 0 20px;
  45. }
  46. </style>
  47. </head>
  48. <body ng-app="App">
  49. <div class="wrapper">
  50. <!-- 导航菜单 -->
  51. <ul>
  52. <li class="active">
  53. <a href="#/index">Index</a>
  54. </li>
  55. <li>
  56. <a href="#/introduce">Introduce</a>
  57. </li>
  58. <li>
  59. <a href="#/contact">Contact Us</a>
  60. </li>
  61. </ul>
  62. <!-- 内容 -->
  63. <div class="content">
  64. <!-- 占位符 -->
  65. <div ng-view></div>
  66. </div>
  67. </div>
  68. <!-- 引入核心框架 -->
  69. <script src="./libs/angular.min.js"></script>
  70. <!-- 引入路由模块 -->
  71. <script src="./libs/angular-route.js"></script>
  72. <script>
  73. var App = angular.module('App', ['ngRoute']);
  74. // 就可以使用路由模块了
  75. // 路由模块需要经过一系列配置才可以使用
  76. // $routeProvider
  77. App.config(['$routeProvider', function ($routeProvider) {
  78. // 第1个参数路由的变化
  79. // 第2个参数当前路由的具体逻辑
  80. $routeProvider.when('/index', {
  81. template: '<h1>Index Page!</h1>'
  82. }).when('/introduce', {
  83. template: '<h1>Introduce Page!</h1>'
  84. }).when('/contact', {
  85. template: '<h1>Contact Us Page!</h1>'
  86. }).when('/404', {
  87. template: '<h1 style="color:red;">Not Found</h1>'
  88. })
  89. .otherwise({
  90. redirectTo: '/404'
  91. });
  92. }]);
  93. </script>
  94. </body>
  95. </html>

通过上面的例子发现在单一页面中可以能过hashchange事件监听到锚点的变化,进而可以实现为不同的锚点准不同的视图,单页面应用就是基于这一原理实现的。

AngularJS对这一实现原理进行了封装,将锚点的变化封装成路由(Route),这是与后端路由的根本区别。

在1.2版前路由功能是包含在AngularJS核心代码当中,之后的版本将路由功能独立成一个模块,下载angular-route.js


要实现更新数据,需要发送请求找服务器要,当锚点发送改变后再要数据,使用hashchange事件,添加给window对象,这个事件会在锚点发生改变的时候触发

window.addEventListener('hashchangge',function(){

    

});

10.2.1 使用

1、引入angular-route.js

1054487-20161225193354557-1102048225.jpg

 

2、实例化模块(App)时,当成依赖传进去(模块名称叫ngRoute)。

1054487-20161225193354745-646140639.jpg

 

3、配置路由模块

1054487-20161225193355073-1787710203.jpg

 

4、布局模板

通过ng-view指令布局模板,路由匹配的视图会被加载渲染到些区域。

1054487-20161225193355386-481843952.jpg

 

10.2.1 路由参数

1、提供两个方法匹配路由,分别是when和otherwise,when方法需要两个参数,otherwise方法做为when方法的补充只需要一个参数,其中when方法可以被多次调用。

2、第1个参数是一个字符串,代表当前URL中的hash值。

3、第2个参数是一个对象,配置当前路由的参数,如视图、控制器等。

a、template 字符串形式的视图模板

b、templateUrl 引入外部视图模板

c、controller 视图模板所属的控制器

d、redirectTo跳转到其它路由

4、获取参数,在控制中注入$routeParams可以获取传递的参数

1054487-20161225193355682-1048579372.jpg

 

1054487-20161225193355932-469267657.jpg

 

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS 路由和多视图</title>
  6. <style>
  7. body {
  8. padding: 0;
  9. margin: 0;
  10. background-color: #F7F7F7;
  11. font-family: Arial;
  12. }
  13. .wrapper {
  14. width: 980px;
  15. margin: 50px auto;
  16. }
  17. ul {
  18. padding: 0;
  19. margin: 0;
  20. overflow: hidden;
  21. list-style: none;
  22. background-color: #000;
  23. border-radius: 4px;
  24. }
  25. li {
  26. float: left;
  27. width: 120px;
  28. height: 40px;
  29. text-align: center;
  30. line-height: 40px;
  31. font-size: 18px;
  32. }
  33. li.active {
  34. background-color: #333;
  35. }
  36. li a {
  37. display: block;
  38. color: #FFF;
  39. text-decoration: none;
  40. }
  41. .content {
  42. margin-top: 30px;
  43. font-size: 24px;
  44. padding: 0 20px;
  45. }
  46. </style>
  47. </head>
  48. <body ng-app="App">
  49. <div class="wrapper">
  50. <!-- 导航菜单 -->
  51. <ul>
  52. <li class="active">
  53. <a href="#/index">Index</a>
  54. </li>
  55. <li>
  56. <a href="#/introduce">Introduce</a>
  57. </li>
  58. <li>
  59. <a href="#/contact">Contact Us</a>
  60. </li>
  61. </ul>
  62. <!-- 内容 -->
  63. <div class="content">
  64. <!-- 占位符 -->
  65. <div ng-view></div>
  66. </div>
  67. </div>
  68. <!-- 引入核心框架 -->
  69. <script src="./libs/angular.min.js"></script>
  70. <!-- 引入路由模块 -->
  71. <script src="./libs/angular-route.js"></script>
  72. <script>
  73. var App = angular.module('App', ['ngRoute']);
  74. App.config(['$routeProvider', function ($routeProvider) {
  75. $routeProvider.when('/index', {
  76. // 引入外部视图模板
  77. templateUrl: './views/index.tpl',
  78. // 为引入的视图模板指定控制器
  79. controller: 'IndexController'
  80. }).when('/introduce', {
  81. templateUrl: './views/introduce.html'
  82. }).when('/contact', {
  83. templateUrl: './views/concat.tpl'
  84. })
  85. }])
  86. // 定义控制器
  87. App.controller('IndexController', ['$scope', '$http', function ($scope, $http) {
  88. // $http({
  89. // url: ''
  90. // }).success(function (info) {
  91. // $scope.info = info;
  92. // });
  93. // 添加数据
  94. $scope.course = [
  95. {name: 'HTML', level: '初级', days: '10天'},
  96. {name: 'CSS', level: '初级', days: '12天'},
  97. {name: 'JAVASCRIPT', level: '高级', days: '18天'},
  98. ]
  99. }]);
  100. // 后缀是通知操作系统应该使用哪个应用程序将它打开
  101. </script>
  102. </body>
  103. </html>

第11章其它

11.1 jQuery

在没有引入jQuery的前提下AngularJS实现了简版的jQuery Lite,通过angular.element不能选择元素,但可以将一个DOM元素转成jQuery对象,如果引提前引入了jQuery则angular.element则完全等于jQuery。

 
  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>AngularJS jqLite</title>
  6. <style>
  7. .box {
  8. width: 200px;
  9. height: 200px;
  10. border: 1px solid #CCC;
  11. }
  12. </style>
  13. </head>
  14. <body ng-app="App">
  15. <div class="box">有一些文字</div>
  16. <script src="./libs/jquery.min.js"></script>
  17. <script src="./libs/angular.min.js"></script>
  18. <script>
  19. var App = angular.module('App', []);
  20. // 类似于 $('.box').css('color', 'red');
  21. // $('div')
  22. // jQuery 也可将一个原生DOM对象转成jQuery对象
  23. // angular.element() 接收的一个原生DOM对象
  24. // 会将这个原生DOM对象转成jQuery对象
  25. var box = document.querySelector('.box');
  26. angular.element(box).css('color', 'red');
  27. angular.element(box).animate({
  28. width: 400,
  29. height: 400
  30. }, 600);
  31. </script>
  32. </body>
  33. </html>

11.2 bower

基于NodeJS的一个静态资源管理工具,由twitter公司开发维,解决大型网站中静态资源的依赖问题。

1、依赖NodeJS环境和git工具。

2、npm install -g bower安装bower

3、bower search 查找资源信息

4、bower install  安装(下载)资源,通过#号可以指定版本号

5、bower info 查看资源信息

6、bower uninstall 卸载(删除)资源

7、bower init初始化,用来记录资源信息及依赖。


bower可以管理静态资源,并解决依赖关系。bower是基于nodejs的一个工具(使用nodejs开发的),要使用bower需要安装nodejs环境

nodejs就是一个软件,(普通安装即可)。避免安装在中文目录下。

安装完成后,并不会在桌面上创建图标,任务栏也不会有,只可以通过命令行来使用nodejs。

win+r   输入cmd 进入命令管理窗口。

输入 node -v验证nodejs是否正常   -前面有一个空格,显示版本号就是正常。

再输入 npm -v验证npm是否正常

1054487-20161225193356589-1784463643.png

 
 




转载于:https://www.cnblogs.com/litao666/p/6220266.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值