以其数据和展现分离、MVVM、MVC、DI等强大的特性活跃于前端开发市场,是前端敏捷开发使用的主流的必须掌握的框架之一。它包括有控制器、指令、过滤器、自定义过滤器、服务、自定义服务等等重要内容。
AngularJS的重要性:AnuglarJS是前后端分离软件架构模型下,前端业务处理的解决方案!
AngularJS是web应用前端的一个完整的解决方案,框架不仅提供了优雅的DOM操作和基于Ajax的数据交互技术,同时进行了良好的结构整理和常规的业务逻辑处理的封装,使得Angular构建的应用能够灵活的适应不同的项目场景。
注意:AngularJS中提供了如下的解决方案用以前端开发:数据双向绑定、基本模板指令、自定义指令
、表单验证、路由操作、依赖注入、过滤器、内置服务、自定义服务、组件、模块。
补充:
外链:AngularJS官方网站:http://angularjs.org;AngularJS代码下载:http://code.angularjs.org;
AngularJS官方教程:https://code.angularjs.org/1.6.4/docs/tutorial ;
AngularJS官方开发向导:https://code.angularjs.org/1.6.4/docs/guide ;
AngularJS官方API:https://code.angularjs.org/1.6.4/docs/api;
案列:实现购物车功能:
<!DOCTYPE html>
<html ng-app="myApp"> <!--加载一个根模块-->
<head>
<meta charset="UTF-8">
<title>购物车</title>
<link rel="stylesheet" href="js/lib/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="js/lib/AngularJS/angular.min.js"></script>
<style>
.container{margin:50px auto;border:1px solid #ccc;width:1200px;height:600px;}
.container .row .header h2{text-align:center;color:#f00;}
input{width:40px;text-align:center;}
</style>
</head>
<body>
<div class="container" ng-controller="myCtrl">
<div class="row">
<div class="header">
<h2>淘宝购物车</h2>
</div>
</div>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<table class="table table-hover table-strped">
<tr style="background:#ff0;">
<th >商品序号</th>
<th>商品名称</th>
<th>单价</th>
<th>数量</th>
<th>小计金额</th>
<th>操作</th>
</tr>
<tr ng-repeat="goods in goodses">
<td>{{goods.goodsID}}</td>
<td>{{goods.goodsName}}</td>
<td>¥{{goods.goodsPrice}}</td>
<td><input type="text" ng-model="goods.count"></td>
<td>¥{{goods.goodsPrice * goods.count}}</td> <!--小计金额-->
<td >
<a href="javascript:;" ng-click="del($index)">删除</a> <!--单击事件-->
</td>
</tr>
</table>
</div>
</div>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-body text-left">
总计金额:<span>¥{{total()}}</span>
运费金额:<span>¥{{freight()}}</span>
实际金额:<span>¥{{priceAll()}}</span>
<span><a href="javascript:;" ng-click="delall($index)">清空购物车</a></span>
</div>
</div>
</div>
</div>
</div>
<script>
var app = angular.module("myApp",[]); //定义一个模块
app.controller("myCtrl",function($scope){ //定义控制器
$scope.goodses = [ //后端借口返回的json数据
{goodsID:1, goodsName:"商品A", goodsPrice:12.00, count:1, subtotal:12.00},
{goodsID:2, goodsName:"商品B", goodsPrice:44.00, count:1, subtotal:44.00},
{goodsID:3, goodsName:"商品C", goodsPrice:12.00, count:1, subtotal:12.00},
{goodsID:4, goodsName:"商品D", goodsPrice:55.00, count:1, subtotal:55.00},
{goodsID:5, goodsName:"商品E", goodsPrice:89.00, count:1, subtotal:89.00},
{goodsID:6, goodsName:"商品F", goodsPrice:140.00, count:1, subtotal:140.00},
{goodsID:7, goodsName:"商品G", goodsPrice:144.00, count:1, subtotal:144.00},
{goodsID:8, goodsName:"商品H", goodsPrice:135.00, count:1, subtotal:135.00},
{goodsID:9, goodsName:"商品I", goodsPrice:240.00, count:1, subtotal:240.00},
];
//删除:
$scope.del = function(index){
$scope.goodses.splice(index,1);
}
//清空购物车:
$scope.delall = function(index){
$scope.goodses=[ ];
}
//总计金额:
$scope.total = function(){
var allPrice = 0; //计算前先清空为0
for(var i = 0; i < $scope.goodses.length; i++){
allPrice += $scope.goodses[i].goodsPrice * $scope.goodses[i].count;
}
return allPrice;
}
//运费金额:
$scope.freight = function(){
var allPrice = 0;
var freightPrice = 0;
for(var i = 0; i < $scope.goodses.length; i++){
allPrice += $scope.goodses[i].goodsPrice * $scope.goodses[i].count;
}
if( allPrice < 100){ //运算判断
freightPrice = 10;
}else if(allPrice > 100 || allPrice <=200){
freightPrice = 20;
}else if(allPrice > 200 ||allPrice <=500){
freightPrice = 30;
}else{
freightPrice = 0;
}
return freightPrice;
}
//实付金额:
$scope.priceAll = function(){
var allPrice = 0;
var freightPrice = 0;
var priceto = 0;
for(var i = 0; i < $scope.goodses.length; i++){
allPrice += $scope.goodses[i].goodsPrice * $scope.goodses[i].count;
}
if( allPrice < 100){
freightPrice = 10;
priceto = allPrice + freightPrice;
}else if(allPrice > 100 || allPrice <200){
freightPrice = 20;
priceto = allPrice + freightPrice;
}else if(allPrice > 200 ||allPrice < 500){
freightPrice = 30;
priceto = allPrice + freightPrice;
}
return priceto;
}
});
</script>
</body>
</html>
通过这个案列可以看出一些在AngularJS应用中,对传统的HTML进行了扩展,增加并强化了HTML
的功能,从入口属性ng-app(指令)开始加载应用,并逐行编辑解释这些扩展的内容。遇到input标签中的
属性ng-model(指令),就会将它的值当成一个变量进行处理,遇到{{}}这样的结构,就会将括号中的值当
成表达式进行处理。(注意:mustache语法,通过两个大括号来包含一个表达式的结构,Angular会对
mustache语法进行编译并解释成可以运算的表达式进行处理)。
AngularJS就是因为对传统的HTML进行了功能的扩展,所以在一定程度上,实现了软件开发过程中
前后端的架构级别的分离——也就是软件前后端分离架构模型。同时将前端的内容展示、业务功能处理、
数据交互有组织的进行了规划,让前端HTML更加适合如今的企业级平台的web软件开发。
AngularJS中专业术语的表述:
模板template | 包含了Angular特殊扩展标记的HTML代码 |
指令directive | 扩展的HTML代码,自定义的标签、属性等等 |
模型model | 保存在JS中,用来和用户交互的数据 |
作用域scope | 模型数据在HTML页面中产生作用的范围 |
表达式expression | AngularJS在HTML页面中可以运算的语法 |
编译器compiler | 被用来解释HTML代码中的Angular代码 |
过滤器filter | 对HTML页面中输出的数据进行指定格式展示 |
视图view | 统称用户看到的HTML视图页面 |
数据绑定data binding | JS中特定的数据和HTML页面上的数据的关联关系 |
控制器controller | 给视图view提供功能支持的东东 |
依赖注入 dependency injection | Angular自动创建对象并传递对象的一种方式 |
注入器 injector | 专门用来实现依赖注入(DI)的容器 |
模块module | Angular用来对项目进行最高层次封装的东东 |
服务service | Angular用来对视图view提供业务功能支持的东东 |
组件component | 用于对网页的公共部分进行封装重用的Angular代码 通常会包含模板、指令、服务等等 |
AngularJS中的引导程序:
任何应用程序,运行过程中都会有一个运行的入口。AngularJS应用程序也是一样,正常情况下,
引导Ag应用的入口程序有两种:(1) ng-app指令;(2)bootstrap手工引导;常规模式下,是通过ng-app指
令引导Angular应用进行工作的。网页中引入Angular之后,程序运行时会自动查找ng-app指令并从
这个入口开始加载编译并解释执行。
代码:通常,页面中会定义ng-app熟悉来指定入口,在script中通过angular的module来加载ng-app
指定的模块:
<html ng-app=”myApp”>
<script>
angular.module(“myApp”, []);
</script>
</html>
代码:某些特殊情况下,也可以通过脚本来动态控制加载启动Angular应用,通过angular.bootstrap
(dom, module)来启动应用:
<html>
<div id=”myDiv”></div>
<script>
angular.module(“myApp”, []);
var _div = document.getElementById(“myDiv”);
angular.bootstrap(_div, “myApp”);
</script>
</html>
基础语法结构:
1>指令:
什么是指令?
指令:就是扩展了HTML的基本功能,通过额外的标签、属性来增强HTML功能。AngularJS的指令正在
页面中体现出来就是一个标签/属性/class名称/注释等等。
常见的指令,按照指令的功能可以划分为五大类:
1、控制指令,用于ANGULAR应用程序加载流程控制;
2、渲染之令,用于ANGULAR将数据在网页中进行展示/隐藏处理;
3、节点指令,用于ANGULAR对标签、属性、样式、内容进行处理的指令;
4、事件之令,用于处理常规事件操作的指令;
5、其他指令。。。。。。。
(1)基本指令:
ng-app=”myApp”:程序运行的入口,通过名称绑定一个模块;
ng-init:用于在程序运行的过程中,初始化一些变量的数据的操作 ;
ng-model=”param”:数据绑定的指令,主要用于表单元素上的数据绑定;
ng-bind:数据绑定的指令,用于将变量的数据显示到页面上,用于替代mustache语法的;
ng-controller:控制器指令,用于在页面中指定控制器作用范围,通常作为属性出现;
ng-[event]:事件指令,用于在页面中发生某些事件时调用指令的函数;
控制指令:
> ng-app
用于定义Angular应用入口的指令,用于[自动引导]Angular程序的运行
在定义应用程序运行入口的同时,可以绑定一个DOM元素
DOM元素的开始标签和结束标签之间~就可以认为是模块的作用范围
Angular通过ng-app指令,实现自动引导程序运行,底层是通过
bootstrap()进行模块DOM元素加载,开始运行!
ng-app 没有模块,可以引导Angular运行吗?
<html ng-app>
// angular引用可以运行吗?可以运行
Angular会将页面中出现的支持的语法进行解释运行!
>>但是不能使用模块控制器中定义的/挂载的数据,超出了作用范围!
ng-app="模块名称"
该模块就会作为Angular的根模块出现,整个作用范围中,页面View和数据Model可以进行无缝交互!
</html>
> ng-controller
模块中,可以给模块挂载一个或者多个控制器
挂载好的控制器在当前模块范围内,可以通过ng-controller指令来指定控制器的作用范围
目前常规控制器的做法:
先声明模块
模块下挂载控制器>>> 控制器的作用范围仅限于当前模块!>>>局部控制器
Angular1.2版本以前
控制器的定义,是直接通过全局函数来实现的
//控制器:全局控制器
function ctrl($scope) {
$scope.name = "tom";//挂载数据
}
全局控制器的意思,是可以在网页中任意地方通过ng-controller进行注册
全局控制器造成了全局数据污染~!所以Angular在1.2版本以后进行了彻底修改
废弃了全局控制器~ 而是提倡使用挂载在模块下的局部控制器!来更好的控制数据!
代码: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/lib/AngularJS/angular.min.js"></script>
</head>
<body>
<!-- 控制器 -->
<div ng-app="myApp">
<div ng-controller="myCtrl">
<div>局部控制器范围:<span ng-bind="greeting"></span></div>
</div>
<div ng-controller="myCtrl2">
<div>局部控制器范围:<span ng-bind="greeting"></span></div>
</div>
</div>
<div id="myApp2">
<div ng-controller="myApp2Ctrl">
<div>局部控制器App2范围:<span ng-bind="hello"></span></div>
</div>
<div ng-controller="myCtrl2">
<div>局部控制器范围:<span ng-bind="greeting"></span></div>
</div>
</div>
<script>
var app = angular.module("myApp", []);
app.controller("myCtrl" , ["$scope", function($scope){
$scope.greeting = "hello ng-app!"
}]);
app.controller("myCtrl2" , ["$scope", function($scope){
$scope.greeting = "hello ng-app!"
}]);
var app2 = angular.module("myApp2", []);
app2.controller("myApp2Ctrl", ["$scope",function($scope) {
$scope.hello = "my app2 ctrl value!";
}]);
var _mp2 = document.getElementById("myApp2");
angular.bootstrap(_mp2, ["myApp2"]);
</script>
</body>
</html>
渲染指令:
指令的作用就是将数据,渲染展示到页面上【底层是封装了DOM操作】
* ng-repeat 循环渲染指令
* ng-bind 变量渲染指令,mustache语法的替代写法
ng-repeat循环渲染指令
属性直接写在要循环的标签上!
u in users u和users就会被Angular解释成变量,获取变量中的值进行处理
ng-bind-html
这个指令,类似于原生JS的innerHTML
但是使用的时候一定要慎重,对于它修饰的内容,必须确保安全性
如果内容的来源不确定,不要使用编译html标签的属性或者函数>>>XSS攻击
ng-include 包含页面指令
类似于JQuery 中的load()函数,用于加载其他页面
代码:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>渲染指令</title>
<script src="js/lib/AngularJS/angular.min.js"></script>
<script src="js/lib/AngularJS/angular-sanitize.min.js"></script>
</head>
<body>
<div ng-controller="myCtrl">
<h3>ng-repeat</h3>
<ul>
<li ng-repeat="u in users">
<span ng-bind="$index+1"></span>****
<span ng-bind="$first"></span>****
<span ng-bind="$last"></span>****
<span ng-bind="$middle"></span>****
<span ng-bind="$even"></span>****
<span ng-bind="$odd"></span>****
<span ng-bind="u.userID"></span>****
<span ng-bind="u.username"></span>****
<span ng-bind="u.nickname"></span>
</li>
</ul>
<hr/>
<!--
ng-bind
-->
<h3>ng-bind</h3>
<div ng-bind="content"></div>
<div ng-bind="12 * 12"></div>
<div ng-bind="true && false"></div>
<div ng-bind="12 > 10"></div>
<!--<div ng-bind="alert('这是一个JS代码')"></div>-->
<hr/>
<h3>ng-bind-html</h3>
<div ng-bind-html="content"></div>
<div ng-bind-html="12 * 12"></div>
<div ng-bind-html="true && false"></div>
<div ng-bind-html="12 > 10"></div>
<hr>
<div ng-include="/index2_xss.html"></div>
**
<ng-include src="/index2_xss.html"></ng-include>
</div>
</body>
<script>
var app = angular.module("myApp", ['ngSanitize']);
app.controller("myCtrl", ["$scope", function ($scope) {
$scope.users = [
{userID: 10001, username: "cat", nickname: "tom"},
{userID: 10002, username: "mouse", nickname: "jerry"},
{userID: 10003, username: "mouse", nickname: "shuke"},
{userID: 10004, username: "mouse", nickname: "beita"}
];
$scope.content = "<p>这是一段内容</p>";
}]);
</script>
</html>
节点指令:主要用于标签、样式、属性、内容的操作
代码:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/lib/AngularJS/angular.min.js"></script>
<style>
.default{
font-size:16px;
color:#888;
}
.sky {
font-size:18px;
color:#2aabd2;
}
</style>
</head>
<body>
<div ng-controller="myCtrl">
<h2>ng-switch 请参考 js中的switch-case</h2>
<!--
ng-switch **> switch()
ng-switch-when **> case:
ng-switch-default **> default
-->
<div>
<input type="text" ng-model="user"><!-- user变量 -->
<div ng-switch="user"><!-- user变量 -->
<div ng-switch-when="admin"><!-- admin字符串 -->
管理员用户登录
</div>
<div ng-switch-when="user"><!-- user字符串 -->
会员登录
</div>
<div ng-switch-default>
游客登录
</div>
</div>
</div>
<h2>ng-show VS ng-hide 用于显示或者隐藏元素的指令</h2>
<div>
<input type="checkbox" ng-model="flagy">显示?{{flagy}}
<div ng-show="flagy">圆规为什么可以画圆,因为,脚在走,心不动</div>
<div ng-hide="flagy">你为什么不能圆梦,因为,心不定,脚不动!</div>
</div>
<h2>ng-if指令:用于判断输出</h2>
<div>
<input type="checkbox" ng-model="flagx">用户登录{{flagx}}
<div ng-if="flagx" ng-class="'sky'">
ng-if指令,会将DOM元素在DOM树上显示或者移除
</div>
</div>
<hr>
<h1>ng-class指令: {样式名称:布尔类型}[使用做多:掌握]</h1>
<div>
<div ng-class="{default:def,sky:s}">
天地不仁以万物为刍狗
</div>
<input type="checkbox" ng-model="def">使用default样式修饰{{def}}<br />
<input type="checkbox" ng-model="s">使用sky样式修饰{{s}}<br />
</div>
<div>
<!-- [样式class名称] [使用较多:熟悉]-->
<div ng-class="['sky']">
圣人不仁以百姓为刍狗
</div>
</div>
<div>
<!-- 通过flag为true/false来指定使用样式default/sky[使用不多:了解] -->
<div ng-class="{true:default,false:sky}[flag]">
道可道非常道,名可名非常名<br />
无名天地之始有名万物之母
</div>
<input type="checkbox" ng-model="flag">选中{{flag}}
</div>
<h2>ng-class-even/odd</h2>
<div>
<ul>
<li ng-repeat="u in users">
<span ng-bind="u" ng-class-even="'default'" ng-class-odd="'sky'"></span>
</li>
</ul>
</div>
<h2>ng-style</h2>
<div>
<button ng-click="sty={color:'orange'}">点击</button>
<div ng-style="sty">
ng-style样式,主要用于自定义指令的时候进行样式的处理
常规使用方式和行内样式没有什么大区别
</div>
</div>
<h2>ng-src:用于在Angular应用中替代img标签的src属性</h2>
<h2>ng-href:用于在Angular应用中替代a标签的href属性</h2>
</div>
<script>
var app = angular.module("myApp", []);
app.controller("myCtrl", ["$scope", function($scope) {
$scope.users = [
"tom",
"jerry",
"shuke",
"beita"
]
}]);
</script>
</body>
</html>
事件指令:Angular封装的用于操作事件的指令。通常是ng-[event]来命名指令,如ng-click表示单击
事件,Angular中的事件处理,需要将处理函数挂载到对应控制器的$scope上。
代码:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/lib/AngularJS/angular.min.js"></script>
</head>
<body>
<div ng-controller="myCtrl">
<button ng-click="fn1()">点击执行</button>
<button ng-click="fn2($event)">点击执行,附带事件对象$event</button>
<button ng-click="fn2($event, 'tom')">点击执行,多个参数</button>
</div>
<script>
var app = angular.module("myApp", [])
.controller("myCtrl", ["$scope", function($scope) {
$scope.fn1 = function() {
alert("事件执行");
}
$scope.fn2 = function(event,name) {
console.log("事件执行了.", event, name);
}
}]);
</script>
</body>
</html>
2>控制器:
<controller>
控制器:主要对于视图中的数据和事件处理函数进行挂载,同时进行一定的业务功能的底层封装和
处理。
控制器在AngularJS中的作用:
(1)通过$scope进行数据状态的初始化操作;
(2)通过$scope进行事件处理函数的挂载操作。
注意:不要使用控制器做下面的事情:
(1)DOM操作:使用AngularJS中的数据双向绑定和自定义指令执行操作
(2)表单处理:使用Angular中的form controls进行操作
(3)数据格式化展示:使用Angular中的过滤器Filter来进行操作
(4)不同控制器之间的数据共享:使用Angular中的自定义服务Service进行处理
(5)组件生命周期的操作:使用Angular中的自定义服务Service进行处理
定义控制器:
控制器的参数$scope 是不需要传递数据的,AngularJS会,自动给它赋值,$scope上可以挂在数据,
用于当前控制器的范围
app.controller("myCtrl", function($scope) {
// 控制器函数操作部分
// 控制器主要进行数据的初始化操作和事件函数的定义
});
多个控制器:
为了方便多个控制器中的公共数据初始化,AngularJS提供了一个全局作用域对象$rootScope;
AngularJS应用中,仅有一个全局作用域,其他所有的$scope作用域都是$rootScope的子元素。
使用$rootScope,可以用于初始化全局变量和函数,但是存在一个问题: 因为控制器函数中可以直接
使用$rootScope,就有可能会造成全局数据污染 ,规范:$rootScope一般和Angular模块的run()方法
一起使用。来进行全局数据的初始化。
3>作用域:$scope作用域、$rootScope作用域
$scope作用域:
含义:
$scope 作为 控制器函数一个非常重要的参数, AngularJS通过 依赖注入的方式进行自动 赋值 ,挂载数据完成控制器中的数据处理。每个$scope都拥有自己控制器的作用域,并且都独立于当前的控制器。
$rootScope作用域:AngularJS的根作用域/全局作用域
每一个AngularJS应用,都有唯一的一个全局作用域范围,也称为根作用域,Angular中其他的作用域都是
这个根作用域的后代/子作用域。
$watch():$scope对象上,有一个$watch()函数,用于监听模型数据的变化。
$watch()作用:1. 监听单个普通变量;2. 监听多个变量,多个变量之间,通过+连接符连接起来;
3. 监听对象的数据;4. 监听对象的所有属性;5. 监听数组数据~而不监听数组中的对象数据;
6. 监听数据发生变化的细节:修改前 VS 修改后;7. $watch可以重复,不会被覆盖,都会执行!
$scope.$apply();// 重绘数据
5>组件化:
含义:AngularJS作为一个模块化组件开发的web前端框架,对于视图进行组件化封装以达到重用的目
的,是它非常优秀的一个亮点。
什么是组件化?组件化是将页面中一部分UI封装起来进行重复使用,UI中的数据可以是不同的,甚至
组件中可以对UI进行适当的业务逻辑处理,如链接跳转、数据运算等等。
组件选项:(1)template:组件替换模板字符串;
(2)templateUrl:组件替换html模板页面;
(3) controller:组件控制器。
代码:封装一个简单的组件
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/lib/AngularJS/angular.min.js"></script>
</head>
<body>
<my-comp></my-comp>
<my-comp></my-comp>
<my-comp></my-comp>
<my-comp></my-comp>
<script>
var app = angular.module("myApp", []);
// 封装一个简单的组件
app.component("myComp", {
template:"<h1>组件化封装的内容<small>这是一个副标题</small></h1>"
});
</script>
</body>
</html>
组件化的应用:<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/lib/AngularJS/angular.min.js"></script>
</head>
<body>
<page-header></page-header>
<page-slide></page-slide>
<page-footer></page-footer>
<script>
var app = angular.module("myApp", []);
app.component("pageHeader", {
template:"<h2>尊敬的用户{{username}},欢迎访问本系统</h2>",
controller:function($scope) {
$scope.username = "tom";
}
});
app.component("pageSlide", {
template:"<h2>这是一个侧边栏导航</h2>"
});
app.component("pageFooter", {
template:"<h2>这是一个网页底部代码</h2>"
});
</script>
</body>
</html>
组件化项目案列:
HTML页面:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/index4.css">
<script src="js/lib/AngularJS/angular.min.js"></script>
<script src="js/app/index4/index4.js"></script>
</head>
<body>
<div class="container">
<page-header></page-header>
<page-slide></page-slide>
<div class="pageBody">
<!-- 网页中要展示的购物车内容 -->
</div>
<page-footer></page-footer>
</div>
</body>
</html>
js:
var app = angular.module("myApp", []);
app.component("pageHeader", {
templateUrl:"js/app/index4/pageHeader/pageHeader.html",
controller:function($scope) {
}
});
app.component("pageSlide", {
templateUrl:"js/app/index4/pageSlide/pageSlide.html",
controller:function($scope) {
}
});
app.component("pageFooter", {
templateUrl:"js/app/index4/pageFooter/pageFooter.html",
controller:function($scope) {
}
});
三个组件的HTML页面:
page-header:
<div class="header-pageHeader">
页面头部
</div>
<style>
.header-pageHeader{
width:100%;
height:200px;
background:#069;
color:#fff;
}
</style>
page-slide:
<div class="slide-pageSlide">
侧边栏
</div>
<style>
.slide-pageSlide{
float:left;
width:300px;
height:500px;
background:orange;
}
</style>
page-footer:<div class="footer-pageFooter">
页面底部
</div>
<style>
.footer-pageFooter{
clear:both;
width:100%;
height:100px;
background:#888;
color:#fff;
}
</style>
通过这个案例可以看出用组件化写项目,可以优化代码,使代码的格局看起来很平整,通过建立几个文件
,在使用外链式,使它们整合在一起,而且使用组件化可以一直重复利用。
组件化的编写步骤:
什么叫过滤器?
过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果。主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等。ng内置了一些过滤器,它们是:currency(货币)、date(日期)、filter(子串匹配)、json(格式化json对象)、limitTo(限制个数)、lowercase(小写)、uppercase(大写)、number(数字)、orderBy(排序)。总共九种。
代码:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/lib/AngularJS/angular.min.js"></script>
</head>
<body>
<div ng-controller="myCtrl">
<div>
<h3>排序输出</h3>
排序关键词:<input type="text" ng-model="keyword">
排序顺序:<input type="checkbox" ng-model="sort">倒序
<br />
<ul>
<li ng-repeat="u in users | orderBy:keyword:sort">
<span ng-bind="u.userID"></span>****
<span ng-bind="u.username"></span>****
<span ng-bind="u.nickname"></span>
</li>
</ul>
</div>
<div>
<h3>字符串大小写转换过滤器</h3>
<div ng-bind="name"></div>
<div ng-bind="name | uppercase"></div>
<div ng-bind="name | lowercase"></div>
</div>
<div>
<h3>长度限制过滤器</h3>
长度:<input type="text" ng-model="length"><br />
位置:<input type="text" ng-model="index">
<br />
<ul>
<li ng-repeat="u in users | limitTo:length:index">
<span ng-bind="u.userID"></span>****
<span ng-bind="u.username"></span>****
<span ng-bind="u.nickname"></span>
</li>
</ul>
</div>
<div>
<h3>JSON过滤器</h3>
<p>
把数据中的对象,转换成JSON字符串的格式输出展示到页面上
经常能用于代码程序调试,使用较少!
</p>
<span ng-bind="users|json"></span>
</div>
<div>
<h3>过滤输出</h3>
关键词:<input type="text" ng-model="keyword">
<br />
<ul>
<li ng-repeat="u in users | filter:keyword">
<span ng-bind="u.userID"></span>****
<span ng-bind="u.username"></span>****
<span ng-bind="u.nickname"></span>
</li>
</ul>
</div>
<div>
<h3>日期时间过滤器</h3>
<div>
原始输出:<span ng-bind="date"></span>
</div>
<div>
日期格式化:<span ng-bind="date | date"></span>
</div>
<div>
日期格式化:通常情况下,需要按照用户的要求进行输出,这时候就会附带参数
y/M/d/h/m/s/E 年/月/日/时/分/秒/星期
<br />
<span ng-bind="date | date:'yyyy年MM月dd日 hh:mm:ss'"></span><br />
<span ng-bind="date | date:'yyyy年MM月dd日'"></span><br />
<span ng-bind="date | date:'hh:mm:ss'"></span><br />
</div>
</div>
<hr>
<h3>货币格式过滤器</h3>
<div>
原始输出数据的方式:<span ng-bind="price"></span>
</div>
<div>
通过拼接输出数据的方式:¥<span ng-bind="price"></span>.00
</div>
<hr/>
<div>
<p>
对于要展示的货币数据【原始数据就是数字】
按照指定的货币格式进行输出
</p>
货币过滤器输出:<span ng-bind="price | currency"></span><br />
货币过滤器输出:<span ng-bind="price | currency:'人命币¥'"></span><br />
货币过滤器输出:<span ng-bind="price | currency:'¥':3"></span><br />
</div>
</div>
<script>
var app = angular.module("myApp", []);
app.controller("myCtrl", ["$scope", function($scope) {
$scope.price = 499.1213;
$scope.date = new Date();
$scope.name = "John Smith";
$scope.users = [
{userID:1, username:"cat", nickname:"tom"},
{userID:2, username:"xiaofan", nickname:"张小凡"},
{userID:3, username:"biyao", nickname:"碧瑶"},
{userID:4, username:"luxueqi", nickname:"陆雪琪"},
{userID:5, username:"linjingyu", nickname:"林惊羽"},
{userID:6, username:"cengshushu", nickname:"曾书书"},
{userID:7, username:"zhuque", nickname:"朱雀"},
{userID:8, username:"qinglong", nickname:"青龙"},
{userID:9, username:"guiwang", nickname:"鬼王"},
{userID:10, username:"dushen", nickname:"赌神"},
{userID:11, username:"jinpiner", nickname:"金瓶儿"}
]
}]);
</script>
</body>
</html>
过滤器与自定义过滤器的区别:
自定义过滤器,不带参数,
过滤 带参数。
filter的两种使用方法:
1. 在模板中使用filter
我们可以直接在{{}}中使用filter,跟在表达式后面用 | 分割,语法如下:
1
|
{{ expression | filter }}
|
也可以多个filter连用,上一个filter的输出将作为下一个filter的输入(怪不得这货长的跟管道一个样。。)
filter可以接收参数,参数用 : 进行分割,如下:
除了对{{}}中的数据进行格式化,我们还可以在指令中使用filter,例如先对数组array进行过滤处理,然后再循环输出:
2. 在controller和service中使用filter
我们的js代码中也可以使用过滤器,方式就是我们熟悉的依赖注入,例如我要在controller中使用currency过滤器,只需将它注入到该controller中即可,代码如下:
在模板中使用{{num}}就可以直接输出 $123,534.00了!在服务中使用filter也是同样的道理。
此时你可能会有疑惑,如果我要在controller中使用多个filter,难道要一个一个注入吗,这岂不太费劲了?小兄弟莫着急~ng提供了一个$filter服务可以来调用所需的filter,你只需注入一个$filter就够了,使用方法如下:
可以达到同样的效果。好处是你可以方便使用不同的filter了。
7>Angular服务与自定义服务:Angular服务与自定义服务
Angular应用中:
View视图~专门用于数据的展示和提取
Controller控制器,主要用于数据的挂载【数据从哪里来?】
|-- 自定义服务:用于从后端接口获取数据,然后将数据挂载到控制器中
Model数据模型:应用中要使用的各种数据,一般从后端获取之后存储在控制器的变量中
Angular的服务,主要从以下两方面来讲
1.自定义服务
Angular中自定义服务的实现方式有三种
* factory工厂模式实现:比较常用,根据项目组规范进行确定是否使用
* service对象方式:比较常用,根据项目组规范进行确定是否使用
* provider代理方式:Angular框架中的使用方式,常规项目开发很少使用
2.内置服务【$http服务,其他服务在使用的时候再进行讲解】
代码:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/lib/AngularJS/angular.min.js"></script>
</head>
<body>
<div ng-controller="myCtrl">
factory:<div ng-bind="value1"></div>
service:<div ng-bind="value2"></div>
provider:<div ng-bind="value3"></div>
</div>
<script>
var app = angular.module("myApp",[]);
app.controller("myCtrl",["$scope","service1","service2","service3",function($scope,s1,s2,s3){
$scope.value1 = s1;//从自定义服务中获取数据
$scope.value2 = s2.v;
$scope.value3 = s3;
}]);
//第一种实现方式:factory模式
/* 第一种实现方式,以其简洁的使用特色而流行于自定义服务行列
* 在处理返回数据的时候,可以返回字面量、数组、对象、复杂对象等等各种数据
* 极大的满足了我们项目的需要,所以使用较多,需要掌握!
* */
app.factory("service1",function(){
//从后端获取数据:模拟
var _v = "factory value";
//返回数据,返回的数据可以是字符串,可以是复杂对象
return _v;
});
//第二种实现方式:service方法【熟练掌握】
/*
第二种实现方式,以其规范的返回数据而流行与自定义服务行列
service方式,只能返回对象,在某些项目组中,为了规范服务返回的数据~也就是强制指定
必须返回对象数据,才能正常解析,避免了出现大量的各种格式的数据:由于返回数据的标准化而流行!
*/
app.service("service2",function(){
var _v = "service value";
return {v:_v};
});
//第三种实现方式:provider方法
/*
第三种实现方式,要求处理的过程中必须通过this.$get()函数进行返回数据的处理
这种方式在Angular自己的内置服务和框架中使用较多,但是不推荐在项目开发中使用
因为操作的复杂性和代码的可读性无形中让开发人员掌握有一定的难度
*/
app.provider("service3",function(){
this.$get = function(){
return "provider value";
}
});
</script>
</body>
</html>