利用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 相关文章推荐
javascript 异步页面查询实现代码(asp.net)
May 26 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
Jun 19 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
Jan 28 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
jQuery Ajax使用FormData对象上传文件的方法
Sep 07 Javascript
用Axios Element实现全局的请求loading的方法
Mar 15 Javascript
深入浅出理解JavaScript闭包的功能与用法
Aug 01 Javascript
element-ui表格数据转换的示例代码
Aug 24 Javascript
JavaScript实现学生在线做题计时器功能
Dec 05 Javascript
JavaScript实现小球沿正弦曲线运动
Sep 07 Javascript
vue实现两个组件之间数据共享和修改操作
Nov 12 Javascript
5种 JavaScript 方式实现数组扁平化
Oct 05 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
PHP的PSR规范中文版
2013/09/28 PHP
php实现微信公众号无限群发
2015/10/11 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
网页自动跳转代码收集
2009/09/27 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
JS打印组合功能
2016/08/04 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
实现vuex原理的示例
2020/10/21 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
Form表单及django的form表单的补充
2019/07/25 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python遍历字典方式就实例详解
2019/12/28 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
工作交流会欢迎词
2014/01/12 职场文书
汽车促销活动方案
2014/03/31 职场文书
艺术教育实施方案
2014/05/03 职场文书
三好学生事迹材料
2014/12/24 职场文书
美术教师个人总结
2015/02/06 职场文书
大学毕业生自我评价
2015/03/02 职场文书
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技