AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】


Posted in Javascript onJanuary 19, 2017

本文实例讲述了AngularJS框架双向数据绑定机制。分享给大家供大家参考,具体如下:

之前写的一篇《AngularJS入门示例之Hello World详解》 ,介绍ng-model的时候提到:使用AngularJS的双向数据绑定机制,不需要我们编写繁琐的代码来实现同样的功能。现在我们看一个比较震撼的例子,看看angularJS是如何减少我们在前端开发中的繁琐劳动的。越是感受到框架功能的强大,越是能够激发学习的兴趣和动力。

假如我们有一个学生信息列表,包含学生的姓名、地址和年龄信息。假如这个数据源信息保存在data.js文件中。

var g_phones = [
  <span style="white-space:pre"> </span>{
  "name": "wang xx",
  "address": "shanghai",
  "age": 20
},
{
  "name": "li xx",
  "address": "beijing & shanghai",
  "age": 10
},
{
  "name": "qian xx",
  "address": "xian",
  "age": 30
},
];

现在要求实现以下功能:

1、学生信息列表,默认全部显示,显示顺序跟数组顺序一致。
2、提供一个搜索框,能够进行模糊搜索。只要某个学生的name、address、age有一个符号搜索条件,就可以显示。
3、提供一个选择框,能够按照name或者age对学生信息进行排序。

效果图如下:

AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】

使用angularJS实现上述效果的代码如下:

<!--ng-app和ng-controller都是angularJS框架的语法-->
<html ng-app ng-controller="RootController">
  <head>
    <!-- 加载数据文件-->
    <script src="data.js"></script>
    <script src="angular-1.2.25.js"></script>
    <script>
    // angular中的控制器,即MVC模式中的C角色
    function RootController($scope)
    {
      //读取数据源,保存到angular的scope中
      $scope.students = g_students;
      // 搜索字段(默认无条件,用空字符表示)
      $scope.queryProp = '';
      // 排序字段(默认无排序,用空字符表示)
      $scope.orderProp = '';
    }
    </script>
  </head>
  <body>
    <!--ng-model实现数据的双向绑定-->
    Search: <input ng-model="queryProp">
    Sort by:
    <select ng-model="orderProp">
      <option value="name">name</option>
      <option value="age">age</option>
    </select>
    <!--遍历students,对每个项stu,进行filter和orderBy-->
    <ul>
      <li ng-repeat="stu in students | filter:queryProp | orderBy:orderProp">
        <p>{{stu.name}}</p>
        <p>{{stu.address}}</p>
        <p>{{stu.age}}</p>
      </li>
    </ul>
  </body>
</html>

可以看到,实现上述功能,需要的所有HTML/JS代码加起来不到40行,代码是很简洁的,很清晰。

如果不使用angularJS,我们使用JavaScript和jQuery来完成上述功能,我们必须要做的事情如下:

1、给search和sort 这2个控件,绑定事件处理函数。当搜索条件或者排序改变的时候,能够实时刷新学生信息列表。

2、由于有排序,所以必须要编写选择排序或冒泡等排序算法,需要考虑字符串比较和数字比较这2种情况。

3、在JS中,通过字符串拼接的方式将<li>插入到DOM中。写过这种代码的都知道,JS中进行HTML字符串的拼接,非常的复杂。

可以看到使用传统的JS开发方式,有很多重复繁琐的劳动,如事件处理函数的绑定、复杂的html字符串拼接等。通过这个例子,很明显可以看到使用angularJS开发效率远远高于JQuery和javascript这种传统的开发方式。如果你还没有感受到angularJS的强大和吸引力,那么我们再看一下关于angular的产生背景。下面是来自 大漠穷秋译作《用AngularJS开发下一代Web应用》的前言。

“关于Angular 的起源,我可以追溯到2009 年的Google Feedback 项目。当时,对于项目的开发速度以及如何编写可测试代码的问题,我们已经经受了几个月的折磨。6 个月时,我们开发了差不多17000 行前端代码。这时候,团队中的一个成员Misko Hevery 做出了一个大胆的宣言:利用他自己业余时间所开发的一个开源库,他可以在两周之内把目前所有东西重写一遍。

我当时想,两周的时间并不会给我们造成太大的影响,同时我们也接受了Misko 努力构建一些东西的想法。然而Misko 最终还是估算错了时间,他用了三个星期。但是,我们所有人还是被他深深地震撼了,更让我们感到震撼的是,他所开发的新应用的代码量从原来的17000 行压缩到了1500 行。看起来,Misko 的东西值得深入推广。Misko 和我决定,围绕他所提倡的理念组建一个团队,这个简单的理念就是:简化对web 开发者的经验要求。”

通过上面的背景介绍,可以看到angular确实能够极大的减少代码量,提高开发效率。行文至此,如果还是没有激起您对angularJS的兴趣和好奇,那么是我语言组织和表达能力不行,不是angular不行。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
jQuery LigerUI 使用教程表格篇(1)
Jan 18 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
Apr 04 Javascript
jquery实现人性化的有选择性禁用鼠标右键
Jun 30 Javascript
javascript实现tab响应式切换特效
Jan 29 Javascript
Bootstrap安装环境配置教程分享
May 27 Javascript
几种tab切换详解
Feb 03 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
Jul 06 Javascript
通过源码分析Vue的双向数据绑定详解
Sep 24 Javascript
详解react关于事件绑定this的四种方式
Mar 09 Javascript
layui radio性别单选框赋值方法
Aug 15 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
Jun 09 Javascript
Vue学习之常用指令实例详解
Jan 06 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
Jan 19 #Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 #Javascript
学好js,这些js函数概念一定要知道【推荐】
Jan 19 #Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
Jan 19 #Javascript
Reactjs实现通用分页组件的实例代码
Jan 19 #Javascript
react.js 翻页插件实例代码
Jan 19 #Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
Jan 19 #Javascript
You might like
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
ECMAScript 创建自己的js类库
2012/11/22 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
详解python解压压缩包的五种方法
2019/07/05 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
初任培训自我鉴定
2013/10/07 职场文书
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
小学生获奖感言范文
2014/02/02 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
不忘国耻振兴中华演讲稿
2014/05/14 职场文书
网吧消防安全责任书
2014/07/29 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
导游词之青岛太清宫
2019/12/13 职场文书