angularjs学习笔记之双向数据绑定
这次我们来详细讲解angular的双向数据绑定。
一.简单的例子
这个例子我们在第一节已经展示过了,要看的移步这里
这里实现的效果就是,在输入框输入内容,下面也会相应的改变对应的内容。这就实现了数据双向绑定。
二.取值表达式与ng-bind的使用
我们再看一个例子,点击这里,文中出现的第一个例子中,{{greeting.text}}和{{text}}就是一个取值表达式了,但是如果你一直刷新页面,你会发现这样一个问题,那就是页面有时候会一瞬间的出现“{{greeting.text}}{{text}}”这个字符串,那我们该如何解决呢?
这里就用到ng-bind命令了:用于绑定数据表达式。
比如我们可以把
<p>{{greeting.text}}{{text}}</p>
改为:
"<p><spanng-bind="greeting.text"></span><spanng-bind="text"></span></p>";
这样改正之后,页面刷新就不会有不希望出现的字符串出现了。
但是使用命令总要比直接使用表达式的效率低一点,所以我们总结了一个常用规律:一般来说,index使用ng-bind,后续模版中的使用'{{}}'的形式。
三.双向绑定的典型场景-表单
先看一个form.html的内容:
<!doctypehtml> <htmlng-app="UserInfoModule"> <head> <metacharset="utf-8"> <linkrel="stylesheet"href="css/bootstrap-3.0.0/css/bootstrap.css"> <scriptsrc="js/angular-1.3.0.js"></script> <scriptsrc="Form.js"></script> </head> <body> <divclass="panelpanel-primary"> <divclass="panel-heading"> <divclass="panel-title">双向数据绑定</div> </div> <divclass="panel-body"> <divclass="row"> <divclass="col-md-12"> <formclass="form-horizontal"role="form"ng-controller="UserInfoCtrl"> <divclass="form-group"> <labelclass="col-md-2control-label"> 邮箱: </label> <divclass="col-md-10"> <inputtype="email"class="form-control"placeholder="推荐使用126邮箱"ng-model="userInfo.email"> </div> </div> <divclass="form-group"> <labelclass="col-md-2control-label"> 密码: </label> <divclass="col-md-10"> <inputtype="password"class="form-control"placeholder="只能是数字、字母、下划线"ng-model="userInfo.password"> </div> </div> <divclass="form-group"> <divclass="col-md-offset-2col-md-10"> <divclass="checkbox"> <label> <inputtype="checkbox"ng-model="userInfo.autoLogin">自动登录 </label> </div> </div> </div> <divclass="form-group"> <divclass="col-md-offset-2col-md-10"> <buttonclass="btnbtn-default"ng-click="getFormData()">获取Form表单的值</button> <buttonclass="btnbtn-default"ng-click="setFormData()">设置Form表单的值</button> <buttonclass="btnbtn-default"ng-click="resetForm()">重置表单</button> </div> </div> </form> </div> </div> </div> </div> </body> </html>
再看Form.js的内容:
varuserInfoModule=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的内容:
<!doctypehtml> <htmlng-app="MyCSSModule"> <head> <metacharset="utf-8"> <linkrel="stylesheet"href="CSS1.css"> </head> <styletype="text/css"> .text-red{ background-color:#ff0000; } .text-green{ background-color:#00ff00; } </style> <body> <divng-controller="CSSCtrl"> <pclass="text-{{color}}">测试CSS样式</p> <buttonclass="btnbtn-default"ng-click="setGreen()">绿色</button> </div> </body> <scriptsrc="js/angular-1.3.0.js"></script> <scriptsrc="color.js"></script> </html>
我们看第19行:有一个“color”的变量存在于这个p标签中,当点击“绿色”时,执行setGreen函数,改变“color”的值为“green”,所以更改了类名,从而也更改了背景颜色。使用这样的方法,让我们不用去直接操作元素,而是加一个变量就行了。代码简洁直观。
我们再看一下color.js的内容:
varmyCSSModule=angular.module('MyCSSModule',[]); myCSSModule.controller('CSSCtrl',['$scope', function($scope){ $scope.color="red"; $scope.setGreen=function(){ $scope.color="green"; } } ])
属性“color”的默认值为“red”,所以显示红色,点击时执行函数,变为绿色。