利用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 相关文章推荐
获取客户端电脑日期时间js代码(jquery)
Sep 12 Javascript
jQuery中get和post方法传值测试及注意事项
Aug 08 Javascript
jquery form表单获取内容以及绑定数据
Feb 24 Javascript
JQuery validate插件验证用户注册信息
May 11 Javascript
Javascript中的arguments对象
Jun 20 Javascript
第一次接触神奇的Bootstrap菜单和导航
Aug 01 Javascript
js绘制购物车抛物线动画
Nov 18 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
May 16 Javascript
vue基于两个计算属性实现选中和全选功能示例
Feb 08 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
Vue两个版本的区别和使用方法(更深层次了解)
Feb 16 Javascript
Vue关于组件化开发知识点详解
May 13 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 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
php实现的农历算法实例
2015/08/11 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
语义化 H1 标签
2008/01/14 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
javascript操作数组详解
2014/12/17 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
浅析vue深复制
2018/01/29 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
ant design实现圈选功能
2019/12/17 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
PyQt 线程类 QThread使用详解
2017/07/16 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
医师定期考核实施方案
2014/05/07 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
新闻通讯稿范文
2015/07/22 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技