数据绑定有两个方向:

  • 数据 → 界面:我们使用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的双向数据绑定的更多相关文章

  1. angularJs:双向数据绑定

    示例1 <!DOCTYPE html> <html ng-app> <head> <meta charset="UTF-8" /> ...

  2. AngularJS之双向数据绑定,class绑定

    之前一直都是用vue来完成一些日常开发,初入AngularJS,记录一些日常开发遇到的问题. 1.双向数据绑定 AngularJS与vue的区别在于,vue采用的是虚拟DOM,模板文件上绑定的一大堆指 ...

  3. angularJS 的双向数据绑定

    input 里面的vale="变量名";加上ng-model="变量名";控制器的变量名会根据视图层的数据改变而改变,而渲染内容也会根据控制器里面的变量改变而改 ...

  4. Angularjs1.X进阶笔记(1)—两种不同的双向数据绑定

    一. html与Controller中的双向数据绑定 html-Controller的双向数据绑定,在开发中非常常见,也是Angularjs1.x的宣传点之一,使用中并没有太多问题. 1.1数据从ht ...

  5. angularJs的一次性数据绑定:双冒号::

    angularJs 中双冒号 ::来实现一次性数据绑定. 原文: https://blog.csdn.net/qianxing111/article/details/79971544 -------- ...

  6. 《AngularJS权威教程》中关于指令双向数据绑定的理解

    在<AngularJS权威教程>中,自定义指令和DOM双向数据绑定有一个在线demo,网址:http://jsbin.com/IteNita/1/edit?html,js,output,具 ...

  7. AngularJS入门心得2——何为双向数据绑定

    前言:谁说Test工作比较轻松,最近在熟悉几个case,差点没疯.最近又是断断续续的看我的AngularJS,总觉得自己还是没有入门,可能是自己欠前端的东西太多了,看不了几行代码就有几个常用函数不熟悉 ...

  8. Vue、AngularJS 双向数据绑定解剖

    数据与视图的绑定与同步,最终体现在对数据的读写处理过程中,也就是 Object.defineProperty() 定义的数据 set.get 函数中.Vue 中对于的函数为 defineReactiv ...

  9. AngularJS双向数据绑定

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. Oracle Purchasing QUESTIONS AND ANSWERS

    Topic Summary Topic: CORRECTIONS: Corrections Topic: DELIVER: Receiving Delivery Topic: DROPSHIP: Dr ...

  2. 【转载】C#之int与Java之Integer的区别

    本文涉及到一些JVM原理和Java的字节码指令,推荐感兴趣的读者阅读一本有关JVM的经典书籍<深入Java虚拟机(第2版)>,将它与我在<.NET 4.0面向对象编程漫谈>中介 ...

  3. MFC ADO连接Oracle12c数据库 服务端配置

    要想客户端访问服务器端的oracle数据库的话,还需要服务端设置下监听程序及本地网络服务名配置. 发现百度文库上面有这方面的文档,我就不重复写了.请参照一下网址: http://wenku.baidu ...

  4. Linux curl使用简单介绍

    在两台新搬迁的微信服务器上执行命令: curl -H "Content-Type: application/json" -d '{"partner_no":&q ...

  5. Unity3D内置着色器

    Unity内部提供了一些可以直接使用的着色器,这些内置着色器包括以下6个方面: (1)Performance of Unity shaders 着色器的性能和两个方面有关:shader本身和rende ...

  6. JS中 escape, encodeURI 和 encodeURIComponent的区别

    为避免Url字符串在传递过程中的乱码,我们一般需要对字符串进行处理. 在Javascript中实现此功能的全局对象有3个,分别是:escape(),  encodeURI()  和 encodeURI ...

  7. CentOS6.5菜鸟之旅:安装ATI显卡驱动

    一.前言 自从安装了CentOS,我的显卡就没消停过,一直在彪高温而且噪音特别大,于是决定上网搜索解决办法.下面记录下来以供日后查阅. 二.安装fglrx driver(ATI/AMD 显卡的linu ...

  8. mysql DDL时出现的锁等待状态

    如下表格所示: session1: session2: 10:30:27 root@localhost:[testdb] mysql.sock>select * from t2;+------+ ...

  9. Sql Server来龙去脉系列 必须知道的权限控制核心篇

    最近写了<Sql Server来龙去脉系列  必须知道的权限控制基础篇>,感觉反响比较大.这可能也说明了很多程序猿对数据库权限控制方面比较感兴趣,或者某些技术点了解的没有很透彻. 有些人看 ...

  10. JS 的 call apply bind 方法

    js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[,   [,.argN]]]] ...