当前位置:   article > 正文

Web前端学习笔记——AngularJS入门_angularjs学习

angularjs学习

目录

什么是 AngularJS

为什么使用 AngularJS

AngularJS 的核心特性

相关链接

Angular 上手

安装 Angular

简单示例

案例解析

使用总结

Angular 基础概念

MVC 思想

模型

控制器

 

视图模型($scope)

表达式(Expression)

对比 JavaScript 表达式

单向数据绑定

双向数据绑定

Angular 指令系统(Directive)

指令属性小提示

ng-app 指令

ng-bind指令

ng-bind-html指令

ng-repeat 指令

ng-class 指令

ng-show/ng-hide 指令

 ng-cloak指令

ng-link/ng-src 指令

 ng-switch指令

其他常用指令

自定义指令

todomvc-app-template案例


什么是 AngularJS

  • 一款非常优秀的前端高级 JS 框架
  • 最早由 Misko Hevery 等人创建
  • 2009 年被 Google 公式收购,用于其多款产品
  • 目前有一个全职的开发团队继续开发和维护这个库
  • 有了这一类框架就可以轻松构建 SPA 应用程序
  • 轻松构建 SPA(单一页面应用程序)
  • 单一页面应用程序:
    • 只有一个页面(整个应用的一个载体)
    • 内容全部是由AJAX方式呈现出啦的
  • 其核心就是通过指令扩展了 HTML,通过表达式绑定数据到 HTML。

为什么使用 AngularJS

  • 更少的代码,实现更强劲的功能
  • 将一些以前在后台开发中使用的思想带入前端开发
  • 带领当前市面上的框架走向模式化或者架构化

以前我们是这样的:

以后将会是这样的:

传统方式实现加法运算

Angular实现加法运算

传统方式实现数据列表呈现

Angular实现数据列表呈现

AngularJS 的核心特性

  • MVC
  • 模块化
  • 自动化双向数据绑定
  • 指令系统

相关链接

  • http://www.apjs.net/
  • http://www.angularjs.cn/
  • http://docs.angularjs.cn/api
  • https://material.angularjs.org
  • http://angular-ui.github.io/

Angular 上手

安装 Angular

  • 下载 Angular.js 的包
    • https://github.com/angular/angular.js/releases
  • 使用 CDN 上的 Angular.js
    • http://apps.bdimg.com/libs/angular.js/1.4.9/angular.min.js
  • 使用 Bower 安装 bash bower install angular
  • 使用 NPM 安装 bash npm install angular
  • 每种方式安装包,本质都是将angular的库下载到当前文件夹中

简单示例

Hello world

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>第一个AngularJS示例</title>
  6. </head>
  7. <body>
  8. <div ng-app ng-init="name='zhangsan'">
  9. <p>在输入框中尝试输入:</p>
  10. <p>姓名:
  11. <input type="text" ng-model="name">
  12. </p>
  13. <p>{{name}}</p>
  14. </div>
  15. <script src="../bower_components/angular/angular.js"></script>
  16. </body>
  17. </html>

案例解析

  • 当网页加载完毕,AngularJS 自动开始执行;
  • HTML 页面中 ng-xxx 的属性称之为指令(Directive);
  • ng-app 指令告诉 AngularJS,<div> 元素是 AngularJS 应用程序管理的边界;
  • ng-model 指令把文本框的值绑定到变量 name 上;
  • {{ name }} 表达式就是把应用程序变量 name 绑定到某个段落的 innerHTML。

使用总结

  • Angular 最大程度的减少了页面上的 DOM 操作;
  • 让 JavaScript 中专注业务逻辑的代码;
  • 通过简单的指令结合页面结构与逻辑数据;
  • 通过自定义指令实现组件化编程;
  • 代码结构更合理;
  • 维护成本更低;
  • Angular 解放了传统 JavaScript 中频繁的 DOM 操作
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Angular Hello world</title>
  6. </head>
  7. <!--
  8. 所有需要ng管理的代码必须被包裹在一个有ng-app指令的元素中
  9. ng-app是ng的入口,表示当前元素的所有指令都会被angular管理(对每一个指令进行分析和操作)
  10. -->
  11. <body>
  12. <div ng-app ng-init="user.name='world'">
  13. <h1>使用NG实现双边数据绑定</h1>
  14. <input type="text"
  15. placeholder="请输入你的姓名"
  16. ng-model="user.name">
  17. <p>hello <strong>{{user.name}}</strong></p>
  18. </div>
  19. <script src="bower_components/angular/angular.js"></script>
  20. </body>
  21. </html>

 

Angular 基础概念

MVC 思想

什么是 MVC 思想

  • MVC 是一种应用程序的开发思想,不是设计模式
  • 主要目的是为了解决应用程序展示结构,业务逻辑之间的紧耦合关系
  • 使应用程序的组成分为三个部件,每个部件有自己明确的职责,相互之间没有依赖
  • 将应用程序的组成划分为三个部分:Model View Controller
  • 控制器的作用就是初始化模型用的;
  • 模型就是用于存储数据的
  • 视图用于展现数据

模型

  • AngularJS很重要的一个特性就是实现模块化编程,我们可以通过以下方式创建一个模块,对页面进行功能业务上的划分

  1. // 创建一个名字叫MyApp的模块,第二个参数指的是该模块依赖那些模块
  2. var myApp = angular.module("MyApp", []);
  • 也可以将重复使用的指令或过滤器之类的做成模块便于复用
  • 注意必须指定第二个参数,否则变成找到已经定义的模块
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Angular 模块</title>
  6. </head>
  7. <body>
  8. <div ng-app="myApp" ng-controller="DemoController">
  9. <h1>使用NG实现双边数据绑定</h1>
  10. <input type="text" placeholder="请输入你的姓名" ng-model="user.name">
  11. <p>hello <strong>{{user.name}}</strong></p>
  12. <input type="button" ng-click="show()">
  13. </div>
  14. <script src="bower_components/angular/angular.js"></script>
  15. <script>
  16. // 注册模块 通过module函数,
  17. // 第一个参数是这个模块的名字
  18. // !!! 第二个参数是这个模块所依赖的模块, 如果不依赖任何模块也必须传递第二个参数,如果没有传递第二个参数,angular.module就不是创建一个模块
  19. // angular.module 返回 刚刚创建的模块对象
  20. var app= angular.module('myApp',[]);
  21. // app.controller 方法用于创建一个控制器,所创建的控制器属于myApp模块
  22. // app.controller('DemoCtrl');
  23. // 控制器函数的参数中有一个$scope
  24. // angular.module('myApp').controller('DemoController', function($scope) {
  25. // // 当控制器执行时会自动执行的函数
  26. // $scope.user = {};
  27. // $scope.user.name = '张三';
  28. // // $scope不仅仅可以往视图中暴露数据,还可以暴露行为
  29. // $scope.show = function() {
  30. // console.log($scope.user);
  31. // };
  32. // });
  33. </script>
  34. </body>
  35. </html>

控制器

  • 调度逻辑的集合

  1. angular.module('OneApp', [])
  2. .controller('HelloController', [
  3. '$scope',
  4. function($scope) {
  5. $scope.p = {
  6. name: 'zhangsan'
  7. };
  8. }
  9. ]);
  • 控制器的三种主要职责:
  1. –为应用中的模型设置初始状态
  2. –通过$scope对象把数据模型或函数行为暴露给视图
  3. –监视模型的变化,做出相应的动作
  1. // 监视购物车内容变化,计算最新结果
  2. $scope.$watch(‘totalCart’, calculateDiscount);
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Angular Controller</title>
  6. </head>
  7. <body ng-app="myModule" ng-controller="HelloController">
  8. <script src="bower_components/angular/angular.js"></script>
  9. <script>
  10. // 由于控制器是必须出现在某个模块下的,想创建一个控制器必须先创建模块
  11. var module = angular.module('myModule', []); // 返回的就是模块对象
  12. // angular在执行控制器函数时,
  13. // 会根据参数的名字($scope)去自动的注入对象
  14. // 根据参数名称传递对应对象,所以必须要写正确的参数名称
  15. // module.controller('HelloController', function($scope) {
  16. // console.log($scope);
  17. // });
  18. //
  19. // 由于压缩代码会改变参数名称,注册控制的标准方式就是通过第二个参数传递数组的方式(数组的成员最后一个就是原本的控制器函数,前面的成员都是需要注入的对象名称)
  20. module.controller('HelloController', ['$scope','$http', function(a,b) {
  21. console.log(a);
  22. }]);
  23. </script>
  24. </body>
  25. </html>
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="HelloApp">
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7. <table border="1" ng-controller="WorldController">
  8. <tr>
  9. <td>用户名</td>
  10. <td>
  11. <input type="text" ng-model="user.username">
  12. </td>
  13. </tr>
  14. <tr>
  15. <td>密码</td>
  16. <td>
  17. <input type="password" ng-model="user.password">
  18. </td>
  19. </tr>
  20. <tr>
  21. <td></td>
  22. <td>
  23. <input type="button" ng-click="login()" value="登陆">
  24. </td>
  25. </tr>
  26. <tr>
  27. <td></td>
  28. <td>{{message}}</td>
  29. </tr>
  30. </table>
  31. <script src="bower_components/angular/angular.js"></script>
  32. <script>
  33. // 创建一个模块
  34. var app = angular.module('HelloApp', []);
  35. // 为这个模块创建一个控制器
  36. app.controller('WorldController', ['$scope', function($scope) {
  37. // 数据
  38. $scope.user = {
  39. username: '',
  40. password: ''
  41. };
  42. $scope.demo = '';
  43. // 行为数据
  44. $scope.login = function() {
  45. // 因为数据的变化时双向的同步,所以界面上的值变化会同步到$scope.user上
  46. console.log($scope.user);
  47. };
  48. // 请输入用户名 输入格式不合法
  49. $scope.message = '请输入用户名';
  50. // $scope.message取决于$scope.user
  51. // 官方的API中提供了一个$scope.$watch方法,
  52. $scope.$watch('user.username', function(now, old) {
  53. // 当user.username发生变化时触发这个函数
  54. // console.log('now is ' + now);
  55. // console.log('old is ' + old);
  56. if (now) {
  57. if (now.length < 7) {
  58. $scope.message = '输入格式不合法';
  59. } else {
  60. $scope.message = '';
  61. }
  62. } else {
  63. $scope.message = '请输入用户名';
  64. }
  65. });
  66. // angular 基本不用操作DOM,如果必要,可以使用angular提供的jqlite
  67. //
  68. // angular.element('body')
  69. }]);
  70. </script>
  71. </body>
  72. </html>

 

视图模型($scope)

  • 视图和控制器之间的桥梁
  • 用于在视图和控制器之间传递数据
  • 利用$scope暴露数据模型(数据,行为)

表达式(Expression)

  • 作用:
  1. –使用 表达式 把数据绑定到 HTML。
  • 语法:
  1. –表达式写在双大括号内:{{ expression }}
  • 比较:
  1. –表达式作用类似于ng-bind指令
  2. –建议更多的使用指令
  • AngularJS表达式很像JavaScript表达式
  • 它们可以包含文字、运算符和变量
  • 如 {{ 5 + 5 }} 或 {{ firstName + ‘-’ + lastName }}
  • 数字  {{ 100 + 100 }}
  • 字符串  {{ 'hello' + 'angular' }}
  • 对象  {{ zhangsan.name }}
  • 数组  {{ students[10] }}
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Angular 表达式</title>
  6. <style>
  7. /* ng-cloak指令就是在NG执行完毕过后自动移除 */
  8. [ng-cloak],
  9. .ng-cloak {
  10. display: none;
  11. }
  12. </style>
  13. </head>
  14. <body ng-app class="ng-cloak">
  15. {{ true ? 'true':'false' }}
  16. <script src="bower_components/angular/angular.js"></script>
  17. </body>
  18. </html>

对比 JavaScript 表达式

  • 相同点:
  1. –AngularJS 表达式可以包含字母,操作符,变量。
  • 不同点:
  1. –AngularJS 表达式可以写在 HTML 中。
  2. –AngularJS 表达式不支持条件判断,循环及异常。
  3. –AngularJS 表达式支持过滤器。

单向数据绑定

•模型变化过后,自动同步到界面上;

•一般纯展示型的数据会用到单项数据绑定;

•使用表达式的方式都是单向的

双向数据绑定

•两个方向的数据自动同步:

•模型发生变化自动同步到视图上;

•视图上的数据发生变化过后自动同步到模型上;

Angular 指令系统(Directive)

  • AngularJS 有一套完整的、可扩展的、用来帮助 Web 应用开发的指令集
  • 在 DOM 编译期间,和 HTML 关联着的指令会被检测到,并且被执行
  • 在 AngularJS 中将前缀为 ng- 这种属性称之为指令,其作用就是为 DOM 元素调用方法、定义行为绑定数据等
  • 简单说:当一个 Angular 应用启动,Angular 就会遍历 DOM 树来解析 HTML,根据指令不同,完成不同操作

指令属性小提示

  • HTML5 允许扩展的(自制的)属性,以 data- 开头。
  • AngularJS 属性以 ng- 开头,但是您可以使用 data-ng- 来让网页对 HTML5 有效。
  • 二者效果相同。

ng-app 指令

  • ng-app指令用来标明一个AngularJS应用程序
  • 标记在一个AngularJS的作用范围的根对象上
  • 系统执行时会自动的执行根对象范围内的其他指令
  • 可以在同一个页面创建多个ng-app节点
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-app 指令</title>
  6. </head>
  7. <body>
  8. <!-- angular找到第一个ng-app过后就不会再找 -->
  9. <div ng-app="myApp1" ng-controller="App1Controller">
  10. <input type="button" value="按钮1" ng-click="do1()">
  11. </div>
  12. <div ng-app="myApp2" ng-controller="App2Controller">
  13. <input type="button" value="按钮2" ng-click="do2()">
  14. </div>
  15. <script src="bower_components/angular/angular.js"></script>
  16. <script>
  17. /**
  18. * myApp1 Module
  19. *
  20. * Description
  21. */
  22. var myApp1 = angular.module('myApp1', []);
  23. myApp1.controller('App1Controller', ['$scope', function($scope) {
  24. $scope.do1 = function() {
  25. console.log(11111);
  26. };
  27. }]);
  28. var myApp2 = angular.module('myApp2', []);
  29. myApp2.controller('App2Controller', ['$scope', function($scope) {
  30. $scope.do2 = function() {
  31. console.log(22222);
  32. };
  33. }]);
  34. // 手动的让第二个div被myApp2管理
  35. angular.bootstrap(document.querySelector('[ng-app="myApp2"]'),['myApp2']);
  36. </script>
  37. </body>
  38. </html>

 

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-app 指令</title>
  6. </head>
  7. <body ng-app="myApp">
  8. <!-- angular找到第一个ng-app过后就不会再找 -->
  9. <div ng-controller="App1Controller">
  10. <input type="button" value="按钮1" ng-click="do1()">
  11. </div>
  12. <div ng-controller="App2Controller">
  13. <input type="button" value="按钮2" ng-click="do2()">
  14. </div>
  15. <script src="bower_components/angular/angular.js"></script>
  16. <script>
  17. // 零件1
  18. var myApp1 = angular.module('myApp1', []);
  19. myApp1.controller('App1Controller', ['$scope', function($scope) {
  20. $scope.do1 = function() {
  21. console.log(11111);
  22. };
  23. }]);
  24. // 零件2
  25. var myApp2 = angular.module('myApp2', []);
  26. myApp2.controller('App2Controller', ['$scope', function($scope) {
  27. $scope.do2 = function() {
  28. console.log(22222);
  29. };
  30. }]);
  31. /**
  32. * myApp Module
  33. *
  34. * Description
  35. */
  36. angular.module('myApp', ['myApp1', 'myApp2']);
  37. </script>
  38. </body>
  39. </html>

ng-bind指令

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-bind 指令</title>
  6. </head>
  7. <body ng-app ng-init="username='<h1>shit</h1>'">
  8. <!-- <strong>{{username}}</strong> -->
  9. <!-- ng-bind指令在绑定的值包含HTML时会转义,为了安全(跨站脚本攻击) -->
  10. <strong ng-bind="username"></strong>
  11. <script src="bower_components/angular/angular.js"></script>
  12. </body>
  13. </html>

ng-bind-html指令

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-bind-html 指令</title>
  6. </head>
  7. <body ng-app="myApp" ng-init="username='<h1>shit</h1>'">
  8. <!-- <strong>{{username}}</strong> -->
  9. <!-- ng-bind指令在绑定的值包含HTML时会转义,为了安全(跨站脚本攻击) -->
  10. <strong ng-bind-html="username"></strong>
  11. <script src="bower_components/angular/angular.js"></script>
  12. <script src="bower_components/angular-sanitize/angular-sanitize.js"></script>
  13. <script>
  14. // 使用自定义的模块才可以依赖别的包里面定义模块,angular定义的默认模块没有依赖任何
  15. angular.module('myApp', ['ngSanitize']);
  16. </script>
  17. </body>
  18. </html>

ng-repeat 指令

  • ng-repeat指令用来编译一个数组重复创建当前元素,如
  1. <ul class="messages">
  2. <li ng-repeat="item in messages track by $index">
  3. {{item}}
  4. </li>
  5. </ul>

 

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-repeat 指令</title>
  6. </head>
  7. <body ng-app="myApp">
  8. <ul ng-controller="ListController">
  9. <!-- ng-repeat 会遍历数组中每一个元素,分别创建li -->
  10. <li ng-repeat="item in xiaoheishenghuo" data-id="{{item.id}}">
  11. <span>{{$first?'开始':''}}</span>
  12. <strong>{{item.name}}</strong>
  13. &nbsp;&nbsp;&nbsp;&nbsp;
  14. <span>{{item.age}}</span>
  15. <span>{{$last?'没有了':''}}</span>
  16. </li>
  17. </ul>
  18. <script src="bower_components/angular/angular.js"></script>
  19. <script>
  20. angular.module('myApp', [])
  21. .controller('ListController', ['$scope', function($scope) {
  22. $scope.xiaoheishenghuo = [];
  23. for (var i = 1; i < 10; i++) {
  24. $scope.xiaoheishenghuo[$scope.xiaoheishenghuo.length] = {
  25. id: i,
  26. name: '赵小黑的小' + i,
  27. age: 20 + i
  28. };
  29. }
  30. }]);
  31. </script>
  32. </body>
  33. </html>

ng-class 指令

  • ng-class指令可以设置一个键值对,用于决定是否添加一个特定的类名,键为class名,值为bool类型表示是否添加该类名
  1. <ul class="messages">
  2. <li ng-repeat="item in messages track by $index" ng-class="{red:item.read}">
  3. {{item.content}}
  4. </li>
  5. </ul>

 

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-repeat 指令</title>
  6. <style>
  7. .red {
  8. color: red;
  9. }
  10. .green {
  11. color: green;
  12. }
  13. </style>
  14. </head>
  15. <body ng-app="myApp">
  16. <ul ng-controller="ListController">
  17. <!-- class="{{$even?'red':'green'}}" -->
  18. <!-- ng-class会根据当前设置对象的属性和属性值决定是否添加特定类名 -->
  19. <li ng-repeat="item in xiaoheishenghuo" ng-class="{red:$even,green:$odd}" data-id="{{item.id}}">
  20. <strong>{{item.name}}</strong> &nbsp;&nbsp;&nbsp;&nbsp;
  21. <span>{{item.age}}</span>
  22. </li>
  23. </ul>
  24. <script src="bower_components/angular/angular.js"></script>
  25. <script>
  26. angular.module('myApp', [])
  27. .controller('ListController', ['$scope', function($scope) {
  28. $scope.xiaoheishenghuo = [];
  29. for (var i = 1; i < 10; i++) {
  30. $scope.xiaoheishenghuo[$scope.xiaoheishenghuo.length] = {
  31. id: i,
  32. name: '赵小黑的小' + i,
  33. age: 20 + i
  34. };
  35. }
  36. }]);
  37. </script>
  38. </body>
  39. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-repeat 指令</title>
  6. <style>
  7. .red {
  8. background-color: red;
  9. }
  10. .green {
  11. background-color: green;
  12. }
  13. #box {
  14. height: 200px;
  15. width: 200px;
  16. transition:background-color 1s ease;
  17. }
  18. </style>
  19. </head>
  20. <body ng-app>
  21. <select ng-model="style">
  22. <option value="red">红色</option>
  23. <option value="green">绿色</option>
  24. </select>
  25. <!-- <div id="box" ng-class="style"></div> -->
  26. <div id="box" ng-class="{red:style=='red', green:style=='green'}"></div>
  27. <script src="bower_components/angular/angular.js"></script>
  28. </body>
  29. </html>

 

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-repeat 指令</title>
  6. <style>
  7. .red {
  8. color: red;
  9. }
  10. .green {
  11. color: green;
  12. }
  13. </style>
  14. </head>
  15. <body ng-app="myApp">
  16. <input type="text" ng-model="lastname">
  17. <ul ng-controller="ListController">
  18. <li ng-repeat="name in students track by $id($index)" ng-class="{red:lastname!=''&&name.startsWith(lastname)}">{{name}}</li>
  19. </ul>
  20. <script src="bower_components/angular/angular.js"></script>
  21. <script>
  22. angular.module('myApp', [])
  23. .controller('ListController', ['$scope', function($scope) {
  24. $scope.students = ['胡shit', '赵四', '网商务', '李三', '李三', '李三'];
  25. }]);
  26. </script>
  27. </body>
  28. </html>

ng-show/ng-hide 指令

  • ng-show/ng-hide指令会根据属性值去确定是否展示当前元素,例如ng-show=false则不会展示该元素
  1. <ul class="messages">
  2. <li ng-repeat="item in messages track by $index" ng-show="item.read">
  3. {{item.content}}
  4. </li>
  5. </ul>
  1. <!DOCTYPE html>
  2. <html lang="en" ng-app="myApp">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-class 指令</title>
  6. <style>
  7. .tips {
  8. position: absolute;
  9. top: 0;
  10. left: 0;
  11. right: 0;
  12. bottom: 0;
  13. background-color: rgba(100, 100, 100, .5);
  14. font-size: 40px;
  15. line-height: 100vh;
  16. text-align: center;
  17. }
  18. </style>
  19. </head>
  20. <body ng-controller="ListController">
  21. <div>
  22. aaaaaaaaaaaaaa
  23. </div>
  24. <!-- ng-show 决定是否显示 ng-hide 是否隐藏 ng-if 是否存在 -->
  25. <div class="tips" ng-if="loading">
  26. loading...
  27. </div>
  28. <script src="bower_components/angular/angular.js"></script>
  29. <script>
  30. angular.module('myApp', [])
  31. .controller('ListController', ['$scope', '$timeout', function($scope, $timeout) {
  32. $scope.loading = true;
  33. $timeout(function() {
  34. $scope.loading = false;
  35. $timeout(function() {
  36. $scope.loading = true;
  37. }, 3000);
  38. }, 3000);
  39. }]);
  40. </script>
  41. </body>
  42. </html>

 

 ng-cloak指令

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-cloak 指令</title>
  6. <!-- <style>
  7. [ng\:cloak],
  8. [ng-cloak],
  9. [data-ng-cloak],
  10. [x-ng-cloak],
  11. .ng-cloak,
  12. .x-ng-cloak,
  13. .ng-hide:not(.ng-hide-animate) {
  14. display: none !important;
  15. }
  16. ng\:form {
  17. display: block;
  18. }
  19. .ng-animate-shim {
  20. visibility: hidden;
  21. }
  22. .ng-anchor {
  23. position: absolute;
  24. }
  25. </style> -->
  26. <script src="bower_components/angular/angular.js"></script>
  27. </head>
  28. <body ng-app ng-cloak>
  29. <span>{{'hello angular'}}</span>
  30. </body>
  31. </html>
  • ng-if是指是否存在DOM元素

ng-link/ng-src 指令

  • ng-link/ng-src指令用于解决当链接类型的数据绑定时造成的加载BUG,如
  1. <!-- 浏览器在解析HTML时会去请求{{item.url}}文件 -->
  2. <img src="{{item.url}}">
  3. <!-- 可以使用ng-src解决该问题 -->
  4. <img ng-src="{{item.url}}">
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-src</title>
  6. <script src="bower_components/angular/angular.js"></script>
  7. </head>
  8. <body ng-app ng-init="imgUrl='22.png'" ng-cloak>
  9. <img ng-src="{{imgUrl}}" alt="">
  10. <a ng-href="{{imgUrl}}">跳转到图片</a>
  11. </body>
  12. </html>

 ng-switch指令

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-switch 指令</title>
  6. </head>
  7. <body ng-app>
  8. <select ng-model="selected">
  9. <option value="1">1</option>
  10. <option value="2">2</option>
  11. <option value="3">3</option>
  12. </select>
  13. <div ng-switch="selected">
  14. <div ng-switch-when="1">
  15. 你选择的是1
  16. </div>
  17. <div ng-switch-when="2">
  18. 你选择的是2
  19. </div>
  20. <div ng-switch-when="3">
  21. 你选择的是3
  22. </div>
  23. <div ng-switch-default>
  24. 你什么都没选
  25. </div>
  26. </div>
  27. <script src="bower_components/angular/angular.js"></script>
  28. </body>
  29. </html>

其他常用指令

  • ng-model
  • ng-class
  • ng-show/ng-hide/ng-if
  • ng-click
  • ng-link/ng-src
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ng-xxx 其他指令</title>
  6. </head>
  7. <body ng-app>
  8. <p>
  9. <input type="checkbox" ng-model="checked">全选/取消全选</p>
  10. <ul>
  11. <!-- ng-checked 和 ng-selected 只会做数据到视图的同步,不会做视图到数据的同步 -->
  12. <li>选项01
  13. <input type="checkbox" ng-checked="checked">
  14. </li>
  15. <li>选项02
  16. <input type="checkbox" ng-checked="checked">
  17. </li>
  18. <li>选项03
  19. <input type="checkbox" ng-checked="checked">
  20. </li>
  21. <li>选项04
  22. <input type="checkbox" ng-checked="checked">
  23. </li>
  24. <li>选项05
  25. <input type="checkbox" ng-checked="checked">
  26. </li>
  27. </ul>
  28. <script src="bower_components/angular/angular.js"></script>
  29. </body>
  30. </html>

自定义指令

  • AngularJS中可以通过代码自定义指令:
  1. myModule.directive('hello', function() {
  2. return {
  3. restrict: 'E',
  4. template: '<h1>Hello world</h1>',
  5. replace: true
  6. };
  7. });
  8. myApp.directive("ngHover", function() {
  9. return function(scope, element, attrs) {
  10. element.bind("mouseenter", function() {
  11. element.css("background", "yellow");
  12. });
  13. element.bind("mouseleave", function() {
  14. element.css("background", "none");
  15. });
  16. }
  17. });
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css">
  7. </head>
  8. <body ng-app="demoApp">
  9. <!-- <itcastButton></itcastButton> -->
  10. <!-- <itcast-button></itcast-button> -->
  11. <!-- <div itcastButton></div> -->
  12. <btn-primary></btn-primary>
  13. <btn-danger></btn-danger>
  14. <script src="bower_components/angular/angular.js"></script>
  15. <script>a
  16. var demoApp = angular.module('demoApp', []);
  17. // 第一个参数是指令的名字,第二个参数任然应该使用一个数组,数组的最后一个元素是一个函数
  18. // 定义指令的名字,应该使用驼峰命名法
  19. demoApp.directive('itcastButton', [function() {
  20. // 该函数应该返回一个指令对象
  21. return {
  22. template:'<input type="button" value="itcast" class="btn btn-lg btn-primary btn-block" />'
  23. };
  24. }]);
  25. // demoApp.directive('btnPrimary', [function() {
  26. // return {
  27. // template:'<input type="button" value="itcast" class="btn btn-primary" />'
  28. // };
  29. // }]);
  30. // demoApp.directive('btnDanger', [function() {
  31. // return {
  32. // template:'<input type="button" value="itcast" class="btn btn-danger" />'
  33. // };
  34. // }]);
  35. // demoApp.directive('btnSuccess', [function() {
  36. // return {
  37. // template:'<input type="button" value="itcast" class="btn btn-success" />'
  38. // };
  39. // }]);
  40. demoApp.controller('DemoController', ['$scope', function($scope) {
  41. // $scope.xxxx=xxx;
  42. // $scope.do=function() {
  43. // };
  44. // $scope.$watch('',function(now,old) {
  45. // });
  46. }]);
  47. </script>
  48. </body>
  49. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css">
  7. </head>
  8. <body ng-app="demoApp">
  9. <!-- <btn>itcast</btn> -->
  10. <div breadcrumb></div>
  11. <breadcrumb data=""></breadcrumb>
  12. <script src="bower_components/angular/angular.js"></script>
  13. <script>
  14. var demoApp = angular.module('demoApp', []);
  15. demoApp.directive('breadcrumb', [function() {
  16. // Runs during compile
  17. return {
  18. // 指定当前指令的类型什么样的
  19. // restrict: 'EA',
  20. // // E = Element, A = Attribute, C = Class, M = Comment
  21. // template: '', // 模版字符串
  22. templateUrl: 'tmpls/breadcrumb.html',
  23. replace: true,
  24. // transclude: true,
  25. };
  26. }]);
  27. // demoApp.directive('btn', [function() {
  28. // return{
  29. // scope:{
  30. // primary:'@',
  31. // lg:'@',
  32. // block:'@',
  33. // },
  34. // template:'<button class="btn {{primary==\'true\'?\'btn-primary\':\'\'}}">button</button>'
  35. // }
  36. // }]);
  37. // demoApp.directive('btn', [function() {
  38. // return {
  39. // // 指令对象的transclude必须设置为true才可以在模版中使用ng-transclude指令
  40. // transclude: true,
  41. // replace: true, // 替换指令在HTML中绑定的元素
  42. // template: '<button class="btn btn-primary btn-lg" ng-transclude></button>'
  43. // };
  44. // }]);
  45. </script>
  46. </body>
  47. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>封装一个面包屑导航</title>
  6. <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css">
  7. </head>
  8. <body ng-app="myApp" ng-controller="DemoController">
  9. <breadcrumb data="{{pathData1}}"></breadcrumb>
  10. <breadcrumb data="{{pathData2}}"></breadcrumb>
  11. <script src="bower_components/angular/angular.js"></script>
  12. <script>
  13. var myApp = angular.module('myApp', []);
  14. myApp.controller('DemoController', ['$scope', function($scope) {
  15. $scope.pathData1 = {
  16. home: '#',
  17. itcast: '#',
  18. itheima: '#',
  19. bbs: '#'
  20. };
  21. $scope.pathData2 = {
  22. home: '#',
  23. library: '#',
  24. data: '#'
  25. };
  26. }]);
  27. // 定义一个面包屑导航指令
  28. myApp.directive('breadcrumb', [function() {
  29. // 返回指令对象
  30. return {
  31. scope: {},
  32. templateUrl: 'tmpls/breadcrumb.html',
  33. replace: true,
  34. link: function(scope, element, attributes) {
  35. scope.data = JSON.parse(attributes.data);
  36. // console.log(scope.data);
  37. }
  38. };
  39. }]);
  40. </script>
  41. </body>
  42. </html>

todomvc-app-template案例

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>Template • TodoMVC</title>
  7. <link rel="stylesheet" href="node_modules/todomvc-app-css/index.css">
  8. <!-- CSS overrides - remove if you don't need it -->
  9. <link rel="stylesheet" href="css/app.css">
  10. </head>
  11. <body ng-app="MyTodoMvc">
  12. <section class="todoapp" ng-controller="MainController">
  13. <header class="header">
  14. <h1>todos</h1>
  15. <form ng-submit="add()">
  16. <input class="new-todo" placeholder="What needs to be done?" ng-model="text" autofocus>
  17. </form>
  18. </header>
  19. <section class="main">
  20. <input class="toggle-all" type="checkbox" ng-click="toggleAll()">
  21. <label for="toggle-all">Mark all as complete</label>
  22. <ul class="todo-list">
  23. <li ng-repeat="todo in todos" ng-class="{completed:todo.completed,editing:todo.id===currentEditingId}" data-id="{{todo.id}}">
  24. <div class="view">
  25. <input class="toggle" type="checkbox" ng-model="todo.completed">
  26. <label ng-dblclick="editing(todo.id)">{{todo.text}}</label>
  27. <button class="destroy" ng-click="remove(todo.id)"></button>
  28. </div>
  29. <form ng-submit="save()">
  30. <input class="edit" ng-model="todo.text" ng-blur="save()">
  31. </form>
  32. </li>
  33. </ul>
  34. </section>
  35. <!-- This footer should hidden by default and shown when there are todos -->
  36. <footer class="footer">
  37. <!-- This should be `0 items left` by default -->
  38. <span class="todo-count"><strong>{{todos.length}}</strong> item left</span>
  39. <!-- Remove this if you don't implement routing -->
  40. <ul class="filters">
  41. <li>
  42. <a class="selected" href="#/">All</a>
  43. </li>
  44. <li>
  45. <a href="#/active">Active</a>
  46. </li>
  47. <li>
  48. <a href="#/completed">Completed</a>
  49. </li>
  50. </ul>
  51. <!-- Hidden if no completed items are left ↓ -->
  52. <button class="clear-completed" ng-click="clear()" ng-show="existCompleted()">Clear completed</button>
  53. </footer>
  54. </section>
  55. <footer class="info">
  56. <p>Double-click to edit a todo</p>
  57. <!-- Remove the below line ↓ -->
  58. <p>Template by <a href="http://sindresorhus.com">Sindre Sorhus</a></p>
  59. <!-- Change this out with your name and url ↓ -->
  60. <p>Created by <a href="http://todomvc.com">you</a></p>
  61. <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
  62. </footer>
  63. <!-- Scripts here. Don't remove ↓ -->
  64. <script src="node_modules/angular/angular.js"></script>
  65. <script src="js/app.js"></script>
  66. </body>
  67. </html>
  1. <--!app.js-->
  2. (function(angular) {
  3. 'use strict';
  4. /**
  5. * MyTodoMvc Module
  6. *
  7. * 应用程序的主要的模块
  8. */
  9. var myApp = angular.module('MyTodoMvc', []);
  10. // 注册一个主要的控制器
  11. myApp.controller('MainController', ['$scope', function($scope) {
  12. // [1,2,3,4,5]
  13. function getId() {
  14. var id = Math.random(); // 1 2
  15. for (var i = 0; i < $scope.todos.length; i++) {
  16. if ($scope.todos[i].id === id) {
  17. id = getId();
  18. break;
  19. }
  20. }
  21. return id;
  22. }
  23. // 文本框需要一个模型
  24. $scope.text = '';
  25. // 任务列表也需要一个
  26. // 每一个任务的结构 { id: 1, text: '学习', completed: true }
  27. $scope.todos = [{
  28. id: 0.123,
  29. text: '学习',
  30. completed: false
  31. }, {
  32. id: 0.22,
  33. text: '睡觉',
  34. completed: false
  35. }, {
  36. id: 0.232,
  37. text: '打豆豆',
  38. completed: true
  39. }, ];
  40. // 添加todo
  41. $scope.add = function() {
  42. if(!$scope.text){
  43. return;
  44. }
  45. $scope.todos.push({
  46. // 自动增长?
  47. id: getId(),
  48. // 由于$scope.text是双向绑定的,add同时肯定可以同他拿到界面上的输入
  49. text: $scope.text,
  50. completed: false
  51. });
  52. // 清空文本框
  53. $scope.text = '';
  54. };
  55. // 处理删除
  56. $scope.remove = function(id) {
  57. // 删除谁
  58. for (var i = 0; i < $scope.todos.length; i++) {
  59. if ($scope.todos[i].id === id) {
  60. $scope.todos.splice(i, 1);
  61. break;
  62. }
  63. }
  64. // $scope.todos
  65. };
  66. // 清空已完成
  67. $scope.clear = function() {
  68. var result = [];
  69. for (var i = 0; i < $scope.todos.length; i++) {
  70. if (!$scope.todos[i].completed) {
  71. result.push($scope.todos[i]);
  72. }
  73. }
  74. $scope.todos = result;
  75. };
  76. // 是否有已经完成的
  77. $scope.existCompleted = function() {
  78. // 该函数一定要有返回值
  79. for (var i = 0; i < $scope.todos.length; i++) {
  80. if ($scope.todos[i].completed) {
  81. return true;
  82. }
  83. }
  84. return false;
  85. };
  86. // 当前编辑哪个元素
  87. $scope.currentEditingId = -1;
  88. $scope.editing = function(id) {
  89. $scope.currentEditingId = id;
  90. };
  91. $scope.save = function() {
  92. $scope.currentEditingId = -1;
  93. };
  94. // $scope.checkall = false;
  95. // $scope.$watch('checkall', function(now, old) {
  96. // for (var i = 0; i < $scope.todos.length; i++) {
  97. // $scope.todos[i].completed = now;
  98. // }
  99. // });
  100. var now = true;
  101. $scope.toggleAll = function() {
  102. for (var i = 0; i < $scope.todos.length; i++) {
  103. $scope.todos[i].completed = now;
  104. }
  105. now = !now;
  106. }
  107. }]);
  108. })(angular);

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/1007476
推荐阅读
相关标签
  

闽ICP备14008679号