利用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 相关文章推荐
使用简洁的jQuery方法实现隔行换色功能
Jan 02 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
Jan 28 Javascript
jquery实现下拉框功能效果【实例代码】
May 06 Javascript
jQuery获取file控件中图片的宽高与大小
Aug 04 Javascript
jQuery 插件封装的方法
Nov 16 Javascript
Vue SSR 组件加载问题
May 02 Javascript
基于Vue2x的图片预览插件的示例代码
May 14 Javascript
React key值的作用和使用详解
Aug 23 Javascript
微信小程序云开发如何使用npm安装依赖
May 18 Javascript
ES6顶层对象、global对象实例分析
Jun 14 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 Javascript
ant design pro中可控的筛选和排序实例
Nov 17 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
Mootools 1.2教程 事件处理
2009/09/15 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
简单使用Python自动生成文章
2014/12/25 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
python实现粒子群算法
2020/10/15 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
给物业的表扬信
2014/01/21 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
作风建设年活动总结
2014/08/27 职场文书
教师节感想
2015/08/11 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
python单向链表实例详解
2022/05/25 Python