利用angular.copy取消變量的雙向綁定與解析
首先我們來(lái)看看示例代碼
<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>
從上面的演示可以看到,當(dāng)點(diǎn)擊copy按鈕時(shí),copyData的值就變成了”this is old data”,成功將user的值復(fù)制到copyUser.
當(dāng)點(diǎn)擊change按鈕后,user1和user的值都變成了'is changed',而copyUser的值卻沒(méi)有發(fā)生改變。這時(shí)候在input輸入框改變值,user和user1的值都會(huì)跟著改變,說(shuō)明了這二者實(shí)際上是同一個(gè)變量引用。而copyUser沒(méi)有發(fā)生變化。
angular.copy 能取消雙向綁定的原理
這跟JavaScript中對(duì)象是引用類型有關(guān)。
JavaScript中的值類型
在JavaScript中,值分為原始值和引用值兩種類型。
原始值:存儲(chǔ)在棧(Stack)中的簡(jiǎn)單數(shù)據(jù)字段,也就是說(shuō),它們的值是直接存儲(chǔ)在變量訪問(wèn)的位置;
引用值:存儲(chǔ)在堆(heap)中,也就是說(shuō),存儲(chǔ)在變量處的值是一個(gè)指針,指向存儲(chǔ)對(duì)象的內(nèi)存處。
如下圖所示:
在JavaScript中的對(duì)象便是引用值,也就是說(shuō)對(duì)象是通過(guò)引用傳遞值的。
所以在上述的代碼中:
對(duì)象$scope.user
和$scope.user1
的值都是指向了同一個(gè)引用。對(duì)于Angular來(lái)說(shuō),監(jiān)聽變量變化是在監(jiān)聽其對(duì)象所引用的地址,所以當(dāng)對(duì)象的引用值發(fā)生了變化,所有指向它的對(duì)象都會(huì)跟著發(fā)生變化。
所以在Angular中,直接通過(guò)對(duì)象的賦值是無(wú)法解除雙向綁定的。所以要想解除雙向綁定的辦法就是新創(chuàng)建個(gè)對(duì)象,然后將原有的對(duì)象的值賦值給新對(duì)象。這不就是JavaScript中的深拷貝嘛。
對(duì)的,angular.copy
就是Angular提供的 deep copy
的方法。所以通過(guò)angular.copy
復(fù)制出來(lái)的對(duì)象,既能和原有的對(duì)象值保持一致,又不與舊對(duì)象指向同一個(gè)引用,從而實(shí)現(xiàn)了解除對(duì)象變量的雙向綁定。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用Angular.js能有所幫助,如果有疑問(wèn)大家可以留言交流。
- 理解Angular數(shù)據(jù)雙向綁定
- 淺談angular.js中實(shí)現(xiàn)雙向綁定的方法$watch $digest $apply
- 自定義Angular指令與jQuery實(shí)現(xiàn)的Bootstrap風(fēng)格數(shù)據(jù)雙向綁定的單選與多選下拉框
- 深入學(xué)習(xí)AngularJS中數(shù)據(jù)的雙向綁定機(jī)制
- 實(shí)例剖析AngularJS框架中數(shù)據(jù)的雙向綁定運(yùn)用
- Angular和Vue雙向數(shù)據(jù)綁定的實(shí)現(xiàn)原理(重點(diǎn)是vue的雙向綁定)
- AngularJS入門教程之雙向綁定詳解
- 深入理解Angularjs向指令傳遞數(shù)據(jù)雙向綁定機(jī)制
- div實(shí)現(xiàn)自適應(yīng)高度的textarea實(shí)現(xiàn)angular雙向綁定
- angular+bootstrap的雙向數(shù)據(jù)綁定實(shí)例
相關(guān)文章
Angular中使用$watch監(jiān)聽object屬性值的變化(詳解)
下面小編就為大家?guī)?lái)一篇Angular中使用$watch監(jiān)聽object屬性值的變化(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Angular6 寫一個(gè)簡(jiǎn)單的Select組件示例
這篇文章主要介紹了Angular6寫一個(gè)簡(jiǎn)單的Select組件示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Angular CLI在Angular項(xiàng)目中如何使用scss詳解
angular-cli自身支持Scss預(yù)處理器,Scss比css更加方便靈活,而且層次清晰,代碼整潔。下面這篇文章主要給大家介紹了關(guān)于Angular CLI在Angular項(xiàng)目中如何使用scss的相關(guān)資料,需要的朋友可以參考下。2018-04-04AngularJS基礎(chǔ)知識(shí)筆記之過(guò)濾器
在我們開發(fā)中經(jīng)常需要在頁(yè)面顯示給用戶的信息需要一定處理格式化,才能顯示給用戶。比如時(shí)間本地化,或者yyyy-MM-dd HH:mm:ss格式,數(shù)字精度格式化,本地化,人名格式化等等。在angularjs中為我們提供了叫filter的指令,讓我們能夠很輕易就能做到著一些列的功能2015-05-05