利用angular.copy取消变量的双向绑定与解析


Posted in Javascript onNovember 25, 2016

首先我们来看看示例代码

<body ng-app="app">
 <div ng-controller="CopyController">
 <div>
 data: <input ng-model="user.data" /><br>
 user.data: {{user.data}} <br>
 user1.data: {{user1.data}} <br>
 <button ng-click="changeData1()">change</button> <br>
 <button ng-click="copy()">copy</button> <br>
 copyData: {{copyUser.data}}
 </div>
 </div>
 <script src="node_modules/angular/angular.min.js"></script>
</body>
<script>
 angular.module('app', [])
 .controller('CopyController', function ($scope) {
 // body...
 $scope.changeData1 = function () {
  // body...
  scope.user1=scope.user1=
scope.user;
  $scope.user1.data = 'is changed';
 }
 $scope.copy = function () {
  // body...
  scope.copyUser=angular.copy(scope.copyUser=angular.copy(
scope.user);
 }
 });
</script>

利用angular.copy取消变量的双向绑定与解析

从上面的演示可以看到,当点击copy按钮时,copyData的值就变成了”this is old data”,成功将user的值复制到copyUser.

当点击change按钮后,user1和user的值都变成了'is changed',而copyUser的值却没有发生改变。这时候在input输入框改变值,user和user1的值都会跟着改变,说明了这二者实际上是同一个变量引用。而copyUser没有发生变化。

angular.copy 能取消双向绑定的原理

这跟JavaScript中对象是引用类型有关。

JavaScript中的值类型

在JavaScript中,值分为原始值和引用值两种类型。

     原始值:存储在栈(Stack)中的简单数据字段,也就是说,它们的值是直接存储在变量访问的位置;

     引用值:存储在堆(heap)中,也就是说,存储在变量处的值是一个指针,指向存储对象的内存处。

如下图所示:

利用angular.copy取消变量的双向绑定与解析

在JavaScript中的对象便是引用值,也就是说对象是通过引用传递值的。

所以在上述的代码中:

对象$scope.user$scope.user1的值都是指向了同一个引用。对于Angular来说,监听变量变化是在监听其对象所引用的地址,所以当对象的引用值发生了变化,所有指向它的对象都会跟着发生变化。

所以在Angular中,直接通过对象的赋值是无法解除双向绑定的。所以要想解除双向绑定的办法就是新创建个对象,然后将原有的对象的值赋值给新对象。这不就是JavaScript中的深拷贝嘛。

对的,angular.copy就是Angular提供的 deep copy 的方法。所以通过angular.copy复制出来的对象,既能和原有的对象值保持一致,又不与旧对象指向同一个引用,从而实现了解除对象变量的双向绑定。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用Angular.js能有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
让iframe子窗体取父窗体地址栏参数(querystring)
Oct 13 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
Aug 05 Javascript
JavaScript新窗口与子窗口传值详解
Feb 11 Javascript
javascript结合ajax读取txt文件内容
Dec 05 Javascript
JavaScript DOM事件(笔记)
Apr 08 Javascript
浅谈JS中的反柯里化( uncurrying)
Aug 17 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
Aug 22 Javascript
微信小程序实现文字跑马灯效果
May 26 Javascript
微信小程序实现购物页面左右联动
Feb 15 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
May 24 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
Jan 21 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
Nov 03 Javascript
JS冒泡事件与事件捕获实例详解
Nov 25 #Javascript
js事件源window.event.srcElement兼容性写法(详解)
Nov 25 #Javascript
使用JS读取XML文件的方法
Nov 25 #Javascript
JS比较两个数值的大小实例
Nov 25 #Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
Nov 25 #Javascript
js移动焦点到最后位置的简单方法
Nov 25 #Javascript
详解JS几种变量交换方式以及性能分析对比
Nov 25 #Javascript
You might like
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
2014/11/22 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
使用script的src实现跨域和类似ajax效果
2014/11/10 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
Python进程通信之匿名管道实例讲解
2015/04/11 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
json跨域调用python的方法详解
2017/01/11 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
教堂婚礼主持词
2014/03/14 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
五一劳动节慰问信
2015/02/14 职场文书
门店店长岗位职责
2015/04/14 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
python爬取新闻门户网站的示例
2021/04/25 Python
ES6 解构赋值的原理及运用
2021/05/25 Javascript
java泛型通配符详解
2021/07/25 Java/Android