AngularJS简单用法

一、数据绑定

  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:指定所包含的行为;

上一篇:巧用css border


下一篇:Eclipse-Java代码规范和质量检查插件-PMD