利用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 传统事件模型构造的事件监听器实现代码
May 31 Javascript
jquery批量控制form禁用的代码
Aug 06 Javascript
如何让DIV可编辑、可拖动示例代码
Sep 18 Javascript
jquery live()重复绑定的解决方法介绍
Jan 03 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
Apr 23 Javascript
jQuery 处理页面的事件详解
Jan 20 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
Aug 25 Javascript
jquery判断当前浏览器的实现代码
Nov 07 Javascript
JS实现复制功能
Mar 01 Javascript
用vue构建多页面应用的示例代码
Sep 20 Javascript
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 jQuery
小程序实现横向滑动日历效果
Oct 21 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截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
php格式化日期实例分析
2014/11/12 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
python ubplot使用方法解析
2020/01/10 Python
keras:model.compile损失函数的用法
2020/07/01 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
生产部主管岗位职责
2014/01/06 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
婚前保证书
2014/04/29 职场文书
社会工作专业自荐信
2014/09/26 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
嘉宾邀请函
2015/01/31 职场文书
SqlServer 垂直分表(减少程序改动)
2021/04/16 SQL Server
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA