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 相关文章推荐
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
Nov 24 Javascript
js里怎么取select标签里的值并修改
Dec 10 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
Aug 28 Javascript
a标签的href与onclick事件的区别详解
Nov 12 Javascript
JavaScript实现的多个图片广告交替显示效果代码
Sep 04 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
Jan 17 Javascript
本地搭建微信小程序服务器的实现方法
Oct 27 Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
如何编写一个d.ts文件的步骤详解
Apr 13 Javascript
vue 国际化 vue-i18n 双语言 语言包
Jun 07 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
vscode自定义vue模板的实现
Jan 27 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
Python中的super用法详解
2015/05/28 Python
探究python中open函数的使用
2016/03/01 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Python封装原理与实现方法详解
2018/08/28 Python
简单分析python的类变量、实例变量
2019/08/23 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
美国现代家具购物网站:LexMod
2019/01/09 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
C#面试题
2016/05/06 面试题
代理协议书
2014/04/22 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
英语感谢信范文
2015/01/20 职场文书
朋友聚会开场白
2015/06/01 职场文书
大学生军训感言
2015/08/01 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python
pandas数值排序的实现实例
2021/07/25 Python
MYSQL 表的全面总结
2021/11/11 MySQL
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
一文解答什么是MySQL的回表
2022/08/05 MySQL