一、数据绑定
AngularJS的双向数据绑定,意味着你可以在Mode(JS)中改变数据,而这些变动立刻就会自动出现在View上,反之亦然。即:一方面可以做到model变化驱动了DOM中元素变化,另一方面也可以做到DOM元素的变化也会影响到Model。
在我们使用jQuery的时候,代码中会大量充斥类似这样的语句:var val = $(‘#id’).val(); $(‘#id’).html(str);等等,即频繁的DOM操作(读取和写入),其实我们的最终目的并不是要操作DOM,而是要实现业务逻辑。ng的绑定将让你摆脱DOM操作,只要模板与数据通过声明进行了绑定,两者将随时保持同步,最新的数据会实时显示在页面中,页面中用户修改的数据也会实时被记录在数据模型中。
从View到Controller再到View的数据交互(例01):
<html ng-app="demoApp"> …… <input type="text" ng-model="user.name" placeholder="请输入名称"/> Hello, {{ user.name }}! …… 关键: ng-app 、 ng-model 和 { {user.name } } 首先: <html>元素的ng-app属性。标识这个DOM里面的内容将启用AngularJS应用。 其次:告诉AngularJS,对页面上的“user.name” 这个Model进行双向数据绑定。 第三:告诉AngularJS,在“{{ user.name}}”这个指令模版上显示“user.name”这个Model的数据。 从Server到Controller再到View的数据交互(例02): <html ng-app="demoApp"> …… <div ng-controller="demoController"> <input type="text" ng-model="user.name" disabled="disabled"/> <a href="javascript:void(0);" ng-click="getAjaxUser()">AJAX获取名字</a> …… demoApp.controller("demoController", function($http, $scope){ $scope. getAjaxUser = function(){ // $http.get("../xxx.action").success(function(data){ // $scope.user= data; // }); $scope.user = {"name":"从JOSN中获取的名称","age":22}; }; });
改变$scope中的user,View也会自动更新。
二、scope:
$scope是一个把view(一个DOM元素)连结到controller上的对象。在我们的MVC结构里,这个 $scope 将成为model,它提供一个绑定到DOM元素(以及其子元素)上的excecution context。
尽管听起来有点复杂,但 $scope 实际上就是一个JavaScript对象,controller和view都可以访问它,所以我们可以利用它在两者间传递信息。在这个 $scope 对象里,我们既存储数据,又存储将要运行在view上的函数。
每一个Angular应用都会有一个 $rootScope。这个 $rootScope 是最顶级的scope,它对应着含有 ng-app 指令属性的那个DOM元素。
app.run(function($rootScope) { $rootScope.name = "张三"; });
如果页面上没有明确设定 $scope ,Angular 就会把数据和函数都绑定到这里, 第一部分中的例子就是靠这一点成功运行的。
这样,我们就可以在view的任何地方访问这个name属性,使用模版表达式{{}},像这样:
{{ name }}
三、module
在<html>标签上多了一个属性ng-app=”MyApp”,它的作用就是用来指定ng的作用域是在<html>标签以内部分。在js中,我们调用angular对象的module方法来声明一个模块,模块的名字和ng-app的值对应。这样声明一下就可以让ng运行起来了。
示例:
<html ng-app="demoApp">
var demoApp = angular.module(‘demoApp‘, []);
四、ajax
$http 服务是AngularJS的核心服务之一,它帮助我们通过XMLHttpRequest对象或JSONP与远程HTTP服务进行交流。
$http 服务是这样一个函数:它接受一个设置对象,其中指定了如何创建HTTP请求;它将返回一个承诺(*参考JavaScript异步编程的promise模式),其中提供两个方法: success方法和error方法。
demoApp.controller("demoController", function($http, $scope){ $scope. getAjaxUser = function(){ $http.get("../xxx.action").success(function(data){ alert(data); }).error(function(){ Alert(“出错了!”); }); }; });
AngularJS的AJAX与jquery等框架的AJAX基本一致。
五、过滤器
过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果。主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等。过滤器通常是伴随标记来使用的,将你model中的数据格式化为需要的格式。表单的控制功能主要涉及到数据验证以及表单控件的增强。ng内置了一些过滤器,它们是:
currency(货币)、date(日期)、filter(子串匹配)、json(格式化json对象)、limitTo(限制个数)、lowercase(小写)、uppercase(大写)、number(数字)、orderBy(排序)。
过滤器的使用:
1. 在模板中使用filter
我们可以直接在{{}}中使用filter,跟在表达式后面用 | 分割,语法如下:
{{ expression | filter }}
2. 在controller和service中使用filter
我们的js代码中也可以使用过滤器,方式就是我们熟悉的依赖注入,例如我要在controller中使用currency过滤器,只需将它注入到该controller中即可,代码如下:
app.controller(‘testC‘,function($scope,currencyFilter){
$scope.num = currencyFilter(123534);
}
在模板中使用{{num}}就可以直接输出$123,534.00了!在服务中使用filter也是同样的道理。
六、自定义过滤器:
filter的自定义方式也很简单,使用module的filter方法,返回一个函数,该函数接收输入值,并返回处理后的结果。话不多说,我们来写一个看看。比如我需要一个过滤器,它可以返回一个数组中下标为奇数的元素,代码如下:
app.filter(‘odditems‘,function(){/*odditems是自定义的过滤器的名字,函数为自定义的过滤方式*/ return function(inputArray){ var array = []; for(var i=0;i<inputArray.length;i++){ if(i%2!==0){ array.push(inputArray[i]); } } return array; } });
七、指令:
ng内置了很多指令用来控制模板,如ng-repeat,ng-class,也有很多指令来帮你完成业务逻辑,如ng-controller,ng-model。因此我们也可以自定义指令:
指令的几种使用方式如下:
作为标签:<my-dir></my-dir>
作为属性:<span my-dir="exp"></span>
作为注释:<!-- directive: my-dir exp -->
作为类名:<span class="my-dir: exp;"></span>
其实常用的就是作为标签和属性。
1、内置指令
1. ng-class
ng-class用来给元素绑定类名,其表达式的返回值可以是以下三种:
类名字符串,可以用空格分割多个类名,如’redtext boldtext’;
类名数组,数组中的每一项都会层叠起来生效;
一个名值对应的json对象,其键值为类名,值为boolean类型,当值为true时,该类会被加在元素上。
下面来看一个使用map的例子:
ng-class测试
红色 加粗 删除线
<div ng-class=”{redtext:{{red}}, boldtext:{{bold}}, striketext:{{strike}}}” ></div>
如果你想拼接一个类名出来,可以使用插值表达式,如:
<div class=”{{style}}text”>字体样式测试</div>
然后在controller中指定style的值:
$scope.style = ‘red’;
注意我用了class而不是ng-class,这是不可以对换的,官方的文档也未做说明,姑且认为这是ng的语法规则吧。
与ng-class相近的,ng还提供了ng-class-odd、ng-class-even两个指令,用来配合ng-repeat分别在奇数列和偶数列使用对应的类。这个用来在表格中实现隔行换色再方便不过了。
2. ng-style
ng-style用来绑定元素的css样式,其表达式的返回值为一个js对象,键为css样式名,值为该样式对应的合法取值。用法比较简单:
<div ng-style="{color:‘red‘}">ng-style测试</div>
<div ng-style="style">ng-style测试</div>
$scope.style = {color:‘red‘};
3. ng-show,ng-hide
对于比较常用的元素显隐控制,ng也做了封装,ng-show和ng-hide的值为boolean类型的表达式,当值为true时,对应的show或hide生效。框架会用display:block和display:none来控制元素 的显隐。
4、自定义指令:
var demoApp.angular.module("demoApp",[]); demoApp.directive(‘userInfo‘,function(){ return { restrict : ‘E‘, templateUrl : ‘userInfoTemplate.html‘, replace : true, transclude : true, scope : { mytitle : ‘=etitle‘ }, link : function(scope,element,attris){ scope.showText = false; scope.toggleText = function(){ scope.showText = ! scope.showText; } } }; })
Restrict为‘E‘:用作标签(Restrict为‘A‘:用作样式;);replace为true:用模板替换当前标签;transclude为true:将当前元素的内容转移到模板中;scope 为 {mytitle : ‘=etitle‘}:定义一个名为mytitle的MODEL,其值指向当前元素的etitle属性;templateUrl为‘userInfoTemplate.html‘:模板内容为ng-template定义ID为userInfoTemplate.html的内容;link:指定所包含的行为;