亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

學習Angular中作用域需要注意的坑

2019-11-20 09:13:18
字體:
來源:轉載
供稿:網友

Angular作用域

在用angular搭建的網頁應用中,作用域(scope)這個概念是貫穿其中的。在angular的視圖(view)中的很多指令是會創建一個作用域的,例如 ng-app , ng-controller 等。這個作用域就是我們在寫控制器構造函數時注入的 $scope (angular1.2之前的版本),他是視圖模型(view model)中的一個概念。我們的數據模型(model)就是定義在作用域中的。

Angular作用域的坑

用過angular的人應該都會經過一個過程,就是剛開始還是小白的時候,剛看見數據雙向綁定覺得很牛逼,

Angular中作用域的坑1

管他三七二十一直接開始用,一頓綁定。綁定完之后,如果你運氣好(懂得angular作用域原理的老鳥無視),那么雙向綁定就開始如愿工作了,這時候我們也覺得自己好厲害,居然可以這么快就實現“雙向綁定”這個才聽說不久的新功能了。

那么為什么上面說雙向綁定是因為運氣好才能正常工作呢?因為新手剛開始學angular的時候,無非就是看教程然后改動其中的代碼實現自己的業務需求,能剛開始就去學習官方文檔的選手就算有也是少數,所以這樣,大多數剛學習angular的朋友實際上不太了解其中的原理,但是覺得自己已經會用了。

好說了這么多,那我們來看看如果一個新手剛開始給作用域中指定數據模型并且進行雙向綁定時,運氣不那么好的情況。這種情況下,就會遇到上面說的坑,先來看看代碼

// html<div ng-controller="OuterCtrl">  <span ng-bind="a"></span>  <div ng-controller="InnerCtrl">    <span ng-bind="a"></span>    <button ng-click="a=a+1">遞增</button>  </div></div>// javascriptfunction OuterCtrl($scope) {  $scope.a = 1;}function InnerCtrl() {}

上面的代碼就是一個極其簡單的雙向綁定的例子。頁面加載以后,外部 div 和內部 div 中都會顯示1。當按了遞增按鈕之后,會發現只有內部的1變成了2,繼續按也是一樣,只有內部的數字會遞增。那么這時候,新手往往就慌了,說好的神奇的雙向綁定呢?

Angular中作用域的坑2

這個時候寶寶就有點小情緒了,stackoverflow走起,官方文檔走起,最后發現確實有解決方法,比如說將 a 寫成一個對象的屬性 data.a

// html<div ng-controller="OuterCtrl">  <span ng-bind="data.a"></span>  <div ng-controller="InnerCtrl">    <span ng-bind="data.a"></span>    <button ng-click="data.a=data.a+1">遞增</button>  </div></div>// javascriptfunction OuterCtrl($scope) {  $scope.data = {    a: 1  };}function InnerCtrl() {}

然后發現,居然可以工作了,兩個數字都跟著遞增了,我是雙向綁定之王……然后就扔一邊也不管具體的原理繼續學習下一部分教程了。這其實就是我當初學習angular的心路歷程,實在慚愧做了應用部署到生產環境之后才想起來去研究研究內部的原理。

坑總是要填的

廢話說了那么多,坑也去踩了,下面進入填坑階段,也就是這個坑是為什么會出現為什么寫成對象的屬性就能解決。其實知道了原理之后,是很容易理解的。angular的內外層作用域之間是基于javascript的原型鏈來實現的繼承,并且只使用了原型鏈繼承方法,有點JavaScript基礎的朋友應該就能瞬間反應過來,子類原型對象中的引用類型值和父類實例對象中的引用類型值是引用的同一個,而基本類型值則會覆蓋父類對象中的基本類型值,這其實也是組合繼承存在的原因,因為光用原型鏈繼承會帶來上訴問題,扯得有點遠

總之這里,我們可以這樣來看待第一個例子:

function OuterCtrl() {  this.a = 1;}function InnerCtrl() {}var outer = new OuterCtrl();InnerCtrl.prototype = outer;var inner = new InnerCtrl();inner.a = inner.a + 1;

這里,我們將內部的控制器的構造函數的原型對象設置為外部作用域對象,這樣產生的內部作用域對象就繼承了外部對象 outer 中的屬性 a 。這個屬性是個基本類型值,對內部對象的屬性 a 進行訪問的時候,由于內部對象本身不存在這樣的屬性,就會從它的原型對象中查找,原型對象 outer 中存在這樣的屬性,于是返回值,沒有問題,但是如果我們對內部作用域對象的 a 屬性賦值的話,問題就出來了。 inner.a = inner.a + 1; 這個語句實際上進行了前面說的查找 a 屬性值的過程,然后將返回的值賦值給了內部作用域對象的 a 屬性,由于 a 屬性是不存在的,因此創建了一個 a 的基本類型值屬性,屏蔽了外層作用域對象 outer 中的 a 屬性,這個坑就這么出來了。

因此,如果我們將基本類型值屬性換成引用類型值屬性的話,問題就能夠得到解決,因為他們兩個對象對應的屬性是引用的同一個引用類型值,不管在哪對它進行修改都會反應在所有引用他的對象上。

總結

以上就是關于Angular中作用域需要注意的坑的全部內容,希望本文的內容對大家學習Angular中的作用域能有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91禁外国网站| 国产精品老女人精品视频| 国产精品视频免费观看www| 国产精品国模在线| 欧美黑人xxxx| 精品一区二区三区三区| 欧美成aaa人片免费看| 自拍偷拍免费精品| 精品在线小视频| 亚洲石原莉奈一区二区在线观看| 欧美性xxxxx极品| 欧美成人精品影院| 日韩美女视频免费在线观看| 日韩精品高清在线| 日韩中文字幕久久| 亚洲第一福利在线观看| 91精品啪aⅴ在线观看国产| 亚洲人成电影网| 精品成人久久av| 久久久久女教师免费一区| 久久69精品久久久久久久电影好| 亚洲第一区中文字幕| 91精品国产91久久久久久不卡| 亚洲欧美日韩在线一区| zzjj国产精品一区二区| 亚洲va国产va天堂va久久| 欧美激情国内偷拍| 国产一区二区三区视频在线观看| 社区色欧美激情 | 久久国产视频网站| 久久精品美女视频网站| 欧美日韩第一页| 91久久中文字幕| 日韩av免费看网站| 成人在线国产精品| 在线视频欧美日韩精品| 69视频在线播放| 91系列在线播放| 狠狠色香婷婷久久亚洲精品| 亚洲国产精品久久久久秋霞蜜臀| 伊人青青综合网站| 国产精品18久久久久久麻辣| 久久中文精品视频| 日韩av有码在线| 国产亚洲精品美女久久久久| 欧美成人精品h版在线观看| 国产丝袜精品视频| 一级做a爰片久久毛片美女图片| 欧美一级电影免费在线观看| 久久久精品网站| 国产精品男人爽免费视频1| 欧美综合激情网| 精品国产鲁一鲁一区二区张丽| 亚洲欧美制服另类日韩| 中文字幕最新精品| 日韩美女主播视频| 亚洲在线视频福利| 亚洲精品av在线| 欧美剧在线观看| 中文字幕日韩精品有码视频| 欧美黑人巨大xxx极品| 成人福利网站在线观看| 亚洲精品wwww| 国模精品系列视频| 亚洲黄色有码视频| 国产精品扒开腿做爽爽爽男男| 日韩视频在线观看免费| 黑人巨大精品欧美一区二区一视频| 国模视频一区二区| 欧美国产日韩一区二区| 中文欧美在线视频| 91av视频在线播放| 91成人国产在线观看| 精品日韩中文字幕| 8x海外华人永久免费日韩内陆视频| 国产精品高清在线| 成人网址在线观看| 国产精品成人免费电影| 日韩在线视频导航| 久久av.com| 一本一本久久a久久精品综合小说| 欧美性猛交xxxx免费看| 5566日本婷婷色中文字幕97| 91超碰中文字幕久久精品| 亚洲欧洲第一视频| 欧美激情精品久久久久久大尺度| 91老司机在线| 亚洲成年人在线| 亚洲一区二区三区成人在线视频精品| 亚洲欧美日韩成人| 亚洲欧美日本伦理| 欧美裸身视频免费观看| 亚洲精品日韩激情在线电影| 亚洲精品免费在线视频| 一本大道亚洲视频| 狠狠躁夜夜躁人人躁婷婷91| 国产精品日日做人人爱| 欧美激情国内偷拍| 亚洲男人天堂2023| 国产精品网站入口| 免费99精品国产自在在线| 在线视频欧美性高潮| 尤物九九久久国产精品的特点| 欧美精品激情视频| 亚洲欧美在线一区二区| 国产专区精品视频| www欧美日韩| 国产成人亚洲综合91精品| 久久久久久久久久久亚洲| 久99九色视频在线观看| 91免费的视频在线播放| 国产精品69精品一区二区三区| 91免费视频网站| 国内精品一区二区三区四区| 亚洲欧美国内爽妇网| 日韩视频精品在线| 日韩精品中文字幕在线播放| 国产91成人在在线播放| 欧美日韩午夜激情| 国产伦精品一区二区三区精品视频| 国产精品久久久久久超碰| 久久亚洲精品国产亚洲老地址| 精品成人69xx.xyz| 精品亚洲一区二区三区在线观看| 欧美天堂在线观看| 色悠悠久久久久| 亚洲国产成人精品一区二区| 国产一区二区三区高清在线观看| 欧美精品日韩www.p站| 深夜福利国产精品| 中文字幕免费精品一区高清| 欧美大尺度在线观看| 亚洲欧美另类在线观看| 亚洲黄在线观看| 欧美激情亚洲精品| 成人免费看黄网站| 亚洲成av人影院在线观看| 国产精品久久久久999| 日韩精品极品在线观看| 中文字幕欧美日韩va免费视频| 日韩黄色av网站| 国产不卡视频在线| 久久91亚洲人成电影网站| wwwwwwww亚洲| 最近2019中文字幕一页二页| 中文字幕在线观看亚洲| 日本一区二区在线免费播放| 欧美精品成人91久久久久久久| 久久的精品视频| 国产97色在线|日韩| 国产精品久久中文| 亚洲大胆美女视频| 国产精品久久久久久久午夜| 国产精品人成电影在线观看| 日韩免费高清在线观看| 欧美国产日韩视频| 欧美成人三级视频网站| 亚洲一区二区福利| 97久久久久久| 欧美极品少妇与黑人| 亚洲18私人小影院| 91黄色8090| 日韩久久免费电影| 亚洲一区二区三区成人在线视频精品|