angularjs学习笔记之双向数据绑定


Posted in Javascript onSeptember 26, 2015

这次我们来详细讲解angular的双向数据绑定。

一.简单的例子

    这个例子我们在第一节已经展示过了,要看的移步这里

    这里实现的效果就是,在输入框输入内容,下面也会相应的改变对应的内容。这就实现了数据双向绑定。

二.取值表达式与ng-bind的使用

    我们再看一个例子,点击这里,文中出现的第一个例子中,{{greeting.text}}和{{text}}就是一个取值表达式了,但是如果你一直刷新页面,你会发现这样一个问题,那就是页面有时候会一瞬间的出现“{{greeting.text}} {{text}}”这个字符串,那我们该如何解决呢?

    这里就用到ng-bind命令了:用于绑定数据表达式。

    比如我们可以把

<p>{{greeting.text}} {{text}}</p>

    改为:

"<p><span ng-bind="greeting.text"></span><span ng-bind="text"></span></p>";

这样改正之后,页面刷新就不会有不希望出现的字符串出现了。

但是使用命令总要比直接使用表达式的效率低一点,所以我们总结了一个常用规律:一般来说,index使用ng-bind,后续模版中的使用'{{}}'的形式。

三.双向绑定的典型场景-表单

先看一个form.html的内容:

<!doctype html>
<html ng-app="UserInfoModule">

<head>
 <meta charset="utf-8">
 <link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css">
 <script src="js/angular-1.3.0.js"></script>
 <script src="Form.js"></script>
</head>

<body>
 <div class="panel panel-primary">
  <div class="panel-heading">
   <div class="panel-title">双向数据绑定</div>
  </div>
  <div class="panel-body">
   <div class="row">
    <div class="col-md-12">
     <form class="form-horizontal" role="form" ng-controller="UserInfoCtrl">
      <div class="form-group">
       <label class="col-md-2 control-label">
        邮箱:
       </label>
       <div class="col-md-10">
        <input type="email" class="form-control" placeholder="推荐使用126邮箱" ng-model="userInfo.email">
       </div>
      </div>
      <div class="form-group">
       <label class="col-md-2 control-label">
        密码:
       </label>
       <div class="col-md-10">
        <input type="password" class="form-control" placeholder="只能是数字、字母、下划线" ng-model="userInfo.password">
       </div>
      </div>
      <div class="form-group">
       <div class="col-md-offset-2 col-md-10">
        <div class="checkbox">
         <label>
          <input type="checkbox" ng-model="userInfo.autoLogin">自动登录
         </label>
        </div>
       </div>
      </div>
      <div class="form-group">
       <div class="col-md-offset-2 col-md-10">
        <button class="btn btn-default" ng-click="getFormData()">获取Form表单的值</button>
        <button class="btn btn-default" ng-click="setFormData()">设置Form表单的值</button>
        <button class="btn btn-default" ng-click="resetForm()">重置表单</button>
       </div>
      </div>
     </form>
    </div>
   </div>
  </div>
 </div>
</body>

</html>

再看Form.js的内容:

var userInfoModule = angular.module('UserInfoModule', []);
 userInfoModule.controller('UserInfoCtrl', ['$scope',
  function($scope) {
   $scope.userInfo = {
    email: "253445528@qq.com",
    password: "253445528",
    autoLogin: true
   };
   $scope.getFormData = function() {
    console.log($scope.userInfo);
   };
   $scope.setFormData = function() {
    $scope.userInfo = {
     email: 'testtest@126.com',
     password: 'testtest',
     autoLogin: false
    }
   };
   $scope.resetForm = function() {
    $scope.userInfo = {
     email: "253445528@qq.com",
     password: "253445528",
     autoLogin: true
    };
   }
  }
 ])

实现效果截图如下:

上图实现的功能是:

1.点击”获取“,可以在控制台输出三个数据,邮箱、密码和选中状态(true、false)

2.点击“设置”:可以更改两个输入框的值和复选框取消选中的状态;

3.点击“重置”:可以让数据恢复到初始数据。

因为输入框中的ng-model和控制器中的数值实现了双向绑定,所以更改输入框的值或者更改控制器中的值,都会相应的更改双方的值。就这么几行代码,就实现了这么强大的功能,是不是觉得很神奇呢?确实很神奇,不过,更加神奇的还在后面呢!继续吧!

四.动态切换标签样式

先看color.html的内容:

<!doctype html>
<html ng-app="MyCSSModule">

<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="CSS1.css">
</head>
<style type="text/css">
  .text-red {
    background-color: #ff0000; 
  }
  .text-green {
    background-color: #00ff00;
  }
</style>

<body>
  <div ng-controller="CSSCtrl">
    <p class="text-{{color}}">测试CSS样式</p>
    <button class="btn btn-default" ng-click="setGreen()">绿色</button>
  </div>
</body>
<script src="js/angular-1.3.0.js"></script>
<script src="color.js"></script>

</html>

我们看第19行:有一个“color”的变量存在于这个p标签中,当点击“绿色”时,执行setGreen函数,改变“color”的值为“green”,所以更改了类名,从而也更改了背景颜色。使用这样的方法,让我们不用去直接操作元素,而是加一个变量就行了。代码简洁直观。

我们再看一下color.js的内容:

var myCSSModule = angular.module('MyCSSModule', []);
myCSSModule.controller('CSSCtrl', ['$scope',
  function($scope) {
    $scope.color = "red";
    $scope.setGreen = function() {
      $scope.color = "green";
    }
  }
])

属性“color”的默认值为“red”,所以显示红色,点击时执行函数,变为绿色。

Javascript 相关文章推荐
原生JS实现表单checkbook获取已选择的值
Jul 21 Javascript
PHP中CURL的几个经典应用实例
Jan 23 Javascript
高性能JavaScript循环语句和条件语句
Jan 20 Javascript
js获取隐藏元素宽高的实现方法
May 19 Javascript
jQuery Dom元素操作技巧
Feb 04 jQuery
页面点击小红心js实现代码
May 26 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
微信小程序如何播放腾讯视频的实现
Sep 20 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
Jul 30 Javascript
微信小程序自定义胶囊样式
Dec 27 Javascript
js基于canvas实现时钟组件
Feb 07 Javascript
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
JS非Alert实现网页右下角“未读信息”效果弹窗
Sep 26 #Javascript
angularjs学习笔记之完整的项目结构
Sep 26 #Javascript
jQuery实现的登录浮动框效果代码
Sep 26 #Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 #Javascript
JS实现可拖曳、可关闭的弹窗效果
Sep 26 #Javascript
JS实现网页Div层Clone拖拽效果
Sep 26 #Javascript
jQuery超简单选项卡完整实例
Sep 26 #Javascript
You might like
php中iconv函数使用方法
2008/05/24 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
Django卸载之后重新安装的方法
2017/03/15 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
HTML5文档结构标签
2017/04/21 HTML / CSS
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
英国在线泳装店:Simply Swim
2019/05/05 全球购物
班长岗位职责
2013/11/10 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
培根随笔读书笔记
2015/07/01 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android