2.2 ng-model指令

为了建立数据绑定,我们需要用到AngularJS另外一个内置指令ng-model,该指令只能用在表单元素上,使用方法如下:

        <input type="text" name="uname"  ng-model="uname" />

在input输入框上添加ng-model指令后,AngularJS框架就会在对应的作用域中创建一个uname属性和该输入框进行绑定。

数据绑定是AngularJS最优秀的特性之一,下面以一个案例来说明AngularJS数据绑定机制的好处。假如我们要完成这样一个功能,即把用户在表单中输入的信息动态回显到页面中。

如果使用原生的JavaScript,可以通过document对象的getElementById()方法获取输入框对象,响应输入框的keyup事件,在输入框的keyup事件响应方法中获取输入框内容,然后同样以操作DOM的方式把输入框内容显示到页面中,具体代码如下:

代码清单:ch02\ch02_01.html

        <!doctype html>
        <html>
        <head>
            <meta charset="UTF-8">
            <title>ch02_01</title>
        </head>
        <body >
            <div>用户名:<input type="text" name="uname" id="uname" /></div>
            <div><span id="info"></span></div>
            <script type="text/javascript">
                var uname = document.getElementById("uname");
                var info = document.getElementById("info");
                uname.onkeyup = function(){
                    info.innerHTML = uname.value;
                }
            </script>
        </body>
        </html>

上面的代码非常简单,相信读者都能看懂,接下来在浏览器中运行ch02_01.html页面,效果如图2.2所示。

图2.2 动态回显用户输入示例

可以看到界面上显示的内容随着输入的改变而动态改变。本例中我们编写了数行JavaScript代码,为了突出AngularJS数据绑定机制的优势,我们再使用AngularJS数据绑定机制来完成这个案例,具体代码如下:

代码清单:ch02\ch02_02.html

        <!doctype html>
        <html ng-app>
        <head>
            <meta charset="UTF-8">
            <title>ch02_02</title>
            <script type="text/javascript" src="../angular-1.5.5/angular.js">
            </script>
        </head>
        <body >
            <div>用户名:<input type="text" ng-model="uname" /></div>
            <div>{{uname}}</div>
        </body>
        </html>

在浏览器中运行ch02_02.html页面,就会发现运行效果和上一个案例完全相同,但是本案例中的核心代码仅仅只有下面两行:

        <div>用户名:<input type="text" ng-model="uname" /></div>
        <div>{{uname}}</div>

如上面的代码所示,我们甚至连一行JavaScript代码都没有编写就完成了这个功能,到底是怎样做到的呢?下面对该应用进行剖析:

上面案例中的ng-app指令用于启动AngularJS应用。需要注意的一点是,当AngularJS遇到ng-app指令时就会创建一个名为$rootSocpe的作用域,该作用域为AngularJS应用的根作用域。

作用域其实是一个简单的JavaScript对象,形式如下:

     var $rootScope={uname:”江荣波"};

我们把ng-model指令作为属性添加到input标签中,此时AngularJS会在$rootSocpe作用域中添加一个uname属性和input输入框绑定,当我们在input表单中输入内容时,AngularJS会自动把输入的内容同步到作用域的uname属性中,因此我们不需要自己响应input标签的keyup事件去处理。

{{uname}}为AngularJS的表达式形式,可以访问AngularJS作用域里的属性,这里我们使用表达式把uname属性输出到页面中。同时AngularJS还能够监视作用域中数据的变化,当数据发生变化时,页面显示内容也能够得到实时更新。

注意

在上面的例子中,我们向$rootScope作用域中添加属性进行了数据绑定,会造成全局作用域污染,实际项目中并不会这么做,而是把表单和控制器作用域中的属性进行数据绑定。控制器作用域是根作用域$rootScope的子作用域,后面会接触到。