利用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高级程序设计 读书笔记之十 本地对象Date日期
Feb 27 Javascript
原生js ActiveXObject获取execl里面的值
Nov 01 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
Feb 27 Javascript
javascript实现行拖动的方法
May 27 Javascript
JQuery DIV 动态隐藏和显示的方法
Jun 23 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
Oct 20 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
Sep 11 Javascript
Node+OCR实现图像文字识别功能
Nov 26 Javascript
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
Apr 16 Javascript
vue router 用户登陆功能的实例代码
Apr 24 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+APACHE实现网址伪静态
2015/02/22 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
2006/10/19 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
Python魔术方法专题
2020/06/19 Python
keras输出预测值和真实值方式
2020/06/27 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
python 元组和列表的区别
2020/12/30 Python
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
幼儿园教师岗位职责
2014/03/17 职场文书
教师节学生演讲稿
2014/09/03 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
校友回访母校寄语
2015/02/26 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android