angularjs的双向数据绑定
数据绑定有两个方向:
- 数据 → 界面:我们使用scope对象的$watch()方法监听数据的变化,来更新界面。
<html>
<head>
<title>监听数据</title>
<meta charset='utf-8'>
<script type="text/javascript" src='http://www.runoob.com/try/angularjs/1.2.5/angular.min.js'>
</script>
<script type="text/javascript"> angular.module("binddate",[])
.directive("datebind",function(){
return{
restrict:"E",
template:"<div></div>",
replace:true,
link:function(scope,element,attrs){ //操作DOM结构
element.append("<div>name:<span></span></div>")
.append("<div>age:<span></span></div>")
.append("<div>sex:<span></span></div>")
scope.$watch(attrs.date,function(nv,ov){ //传入新值和旧值
var filds=element.find("span")
filds[0].innerText=nv.name;
filds[1].innerText=nv.age;
filds[2].innerText=nv.sex;
},true) //监听的对象为对象时,要设为true setInterval(function(){
scope.$apply("sb.age=sb.age+1")
},1000)
}
}
}) </script>
</head>
<body ng-app="binddate" ng-init="sb = {name:'JACK',age:21,sex:'male'}"> <!-- 创建一个指令,并且用属性将数据传递给指令 -->
<datebind date="sb"></datebind>
</body>
</html>- 界面 → 数据:我们在界面的DOM对象上监听变化事件,来更新数据,并通过$apply()方法传播变化。
<html>
<head>
<title>修改数据</title>
<meta charset='utf-8'>
<script type="text/javascript" src='http://www.runoob.com/try/angularjs/1.2.5/angular.min.js'>
</script>
<script type="text/javascript"> angular.module("datemodify",[])
.directive("eDate",function(){
return {
restrict:"E",
template:"<ul>",
replace:true,
link:function(scope,element,attrs){
console.log(1)
//获取属性值
var model=attrs.date element.append("<li>name:<input type='text' field='name'></li>")
.append("<li>sex:<input type='text' field='age'></li>")
.append("<li>age:<input type='text' field='sex'></li>") //监听DOM事件,变化时修改值
element.find("input").on("keyup",function(ev){
var field=ev.target.getAttribute("field");
scope[model][field] = ev.target.value;
scope.$apply("")
})
}
}
})
.directive("logger",function(){
return{
restrict:"A",
link:function(scope,element,attrs){
var model = attrs.date;
scope.$watch(model,function(nv){
var cnt=JSON.stringify(nv,null," ")
element.html("<pre>"+cnt+"</pre>")
},true)
}
}
}) </script> <style type="text/css">
ul li{border: 1px solid #ccc;}
</style>
<body ng-app="datemodify" ng-init="sb = {name:'JACK',age:21,sex:'male'}">
<e-date date="sb"></e-date> <div logger date="sb"></div>
</body>
</html>
层级作用域:
ng-app创建一个$rootScope对象。
在默认情况下,一个DOM子元素不会创建新的作用域,也就是说,这个子元素所对应的 scope对象,其实就是它的最近一级的祖先对象对应的scope对象。也是$rootScope对象。
有些指令会导致创建新的作用域,比如ng-controller。如果在一个DOM对象上创建了新的作用域,那么这个scope对象的原型是其最近一级的组件对象的scope对象。
- $watch()
每个scope对象都维护了一个私有的监听队列,每次当我们在scope上执行一次$watch方法,就相当于 向这个监听队列里塞入一个监听函数。
- $apply()
为了捕捉对数据的修改,AngularJS要求开发者使用scope对象的$apply方法对数据进行修改, $apply方法内部会自动地调用监听队列里的监听函数,比如:
angularjs的双向数据绑定的更多相关文章
- angularJs:双向数据绑定
示例1 <!DOCTYPE html> <html ng-app> <head> <meta charset="UTF-8" /> ...
- AngularJS之双向数据绑定,class绑定
之前一直都是用vue来完成一些日常开发,初入AngularJS,记录一些日常开发遇到的问题. 1.双向数据绑定 AngularJS与vue的区别在于,vue采用的是虚拟DOM,模板文件上绑定的一大堆指 ...
- angularJS 的双向数据绑定
input 里面的vale="变量名";加上ng-model="变量名";控制器的变量名会根据视图层的数据改变而改变,而渲染内容也会根据控制器里面的变量改变而改 ...
- Angularjs1.X进阶笔记(1)—两种不同的双向数据绑定
一. html与Controller中的双向数据绑定 html-Controller的双向数据绑定,在开发中非常常见,也是Angularjs1.x的宣传点之一,使用中并没有太多问题. 1.1数据从ht ...
- angularJs的一次性数据绑定:双冒号::
angularJs 中双冒号 ::来实现一次性数据绑定. 原文: https://blog.csdn.net/qianxing111/article/details/79971544 -------- ...
- 《AngularJS权威教程》中关于指令双向数据绑定的理解
在<AngularJS权威教程>中,自定义指令和DOM双向数据绑定有一个在线demo,网址:http://jsbin.com/IteNita/1/edit?html,js,output,具 ...
- AngularJS入门心得2——何为双向数据绑定
前言:谁说Test工作比较轻松,最近在熟悉几个case,差点没疯.最近又是断断续续的看我的AngularJS,总觉得自己还是没有入门,可能是自己欠前端的东西太多了,看不了几行代码就有几个常用函数不熟悉 ...
- Vue、AngularJS 双向数据绑定解剖
数据与视图的绑定与同步,最终体现在对数据的读写处理过程中,也就是 Object.defineProperty() 定义的数据 set.get 函数中.Vue 中对于的函数为 defineReactiv ...
- AngularJS双向数据绑定
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- 【转】Linux 概念架构的理解
转:http://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ==&mid=400583492&idx=1&sn=3b18c463dcc451 ...
- 【Machine Learning】机器学习の特征
绘制了一张导图,有不对的地方欢迎指正: 下载地址 机器学习中,特征是很关键的.其中包括,特征的提取和特征的选择.他们是降维的两种方法,但又有所不同: 特征抽取(Feature Extraction): ...
- 蓝凌表单的表体调用Javascript
应用场景:像请假类表单会在从表输入开始时间.结束时间等字段 需求1:客户希望根据开始.结束时间自动计算小时数 解决方法: 1.主表单增加一行,设三个字段[开始时间合计].[结束时间合计].[开始结束时 ...
- 支付SDK的安全问题——隐式意图可导致钓鱼攻击
该漏洞涉及到app所使用的intent和intent filter. intent是一个可用于从一个app组件请求动作或处理事件的“消息对象”.Intent负责对应用中一次操作的动作.动作涉及数据. ...
- [Linux] zip 与 unzip 命令
zip zip 命令基本格式为: zip options archive inpath inpath ... archive 是 .zip 文件(新的或已经存在的). inpath 是需要打包的目录或 ...
- java trim
rim方法一般用来去除空格,但是根据JDK API的说明,该方法并不仅仅是去除空格,它能够去除从编码’\u0000′ 至 ‘\u0020′ 的所有字符. 回车换行也在这20个字符之中,以下是一个示例: ...
- Cwinux源码解析(一)
我在我的个人博客发表了新的文章,欢迎各位读者批评指正. Cwinux源码解析(一)
- suricata抓包方式之一 AF_PACKET
1.前言 linux提供了原始套接字RAW_SOCKET,可以抓取数据链路层的报文.这样可以对报文进行深入分析.今天介绍一下AF_PACKET的用法,分为两种方式.第一种方法是通过套接字,打开指定的网 ...
- java抽象类和接口区别
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- 利用IronJs在.NET程序里面跑javascript脚本
what’s dlr The dynamic language runtime (DLR) is a runtime environment that adds a set of services f ...