利用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中实现简单的tabs插件功能的代码
Mar 02 Javascript
使用apply方法实现javascript中的对象继承
Dec 16 Javascript
原生js事件的添加和删除的封装
Jul 01 Javascript
JQuery1.8 判断元素是否绑定事件的方法
Jul 10 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
Oct 16 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
Jul 01 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
js插件实现图片滑动验证码
Sep 29 Javascript
React之PureComponent的使用作用
Jul 10 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
Oct 02 Javascript
使用 JavaScript 制作页面效果
Apr 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执行定时任务的实现思路
2015/12/21 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
Python模块学习 datetime介绍
2012/08/27 Python
python逐行读取文件内容的三种方法
2014/01/20 Python
Python中除法使用的注意事项
2014/08/21 Python
Python装饰器使用示例及实际应用例子
2015/03/06 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
python requests post多层字典的方法
2018/12/27 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
卫校中专生的自我评价
2014/01/15 职场文书
军人违纪检讨书
2014/02/04 职场文书
《长征》教学反思
2014/04/27 职场文书
大班幼儿评语大全
2014/04/30 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
驾驶员安全责任书
2014/07/22 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
销售人员管理制度
2015/08/06 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
JS数组去重详情
2021/11/07 Javascript