Controller As與$scope的區(qū)別($scope篇)

在Angular 1.2以后的版本中檩小,對于嵌套Controller的$scope處理就一直是一個很大的坑鳄炉,這部分主要得益于JavaScript語言級對繼承機制(原型繼承)杜耙。
本文主要分析Angular對于嵌套Controller作用域的另外一種解決方法,使用controller as 語法進行處理拂盯。
上篇為$scope的示例分析,下篇為controller as的示例分析泥技。

$scope的傳統(tǒng)寫法示例

假設我們在有3個Controller進行嵌套,打印出同一個變量,使用$scope的代碼是

controller.js

angular.module('app')
  .controller('MainCtrl', function ($scope) {
    $scope.title = "第一層";
  })
  .controller('AnotherCtrl', function ($scope) {
    $scope.title = "第二層";
  })
  .controller('YetAnotherCtrl', function ($scope) {
    $scope.title = "第三層";
  })

與之對應的view代碼則為

view.html

<div ng-controller="MainCtrl">
  {{ title }}
  <div ng-controller="AnotherCtrl">
    {{ title }}
    <div ng-controller="YetAnotherCtrl">
      {{ title }}
    </div>
  </div>
</div>

則HTML的頁面結(jié)果就是

<div ng-controller="MainCtrl" class="ng-scope ng-binding">
  第一層
  <div ng-controller="AnotherCtrl" class="ng-scope ng-binding">
    第二層
    <div ng-controller="YetAnotherCtrl" class="ng-scope ng-binding">
      第三層
    </div>
  </div>
</div>

$scope的繼承機制

繼承

如當?shù)谌龑拥腨etAnotherCtrl不在自己的$scope內(nèi)對title變量做賦值操作珊豹,則$scope.title會指向上一層的AnotherCtrl中的$scope中進行調(diào)用簸呈,這里有一個向上尋找的過程,很類似Java中的多態(tài)實現(xiàn)(但只是類似)店茶。
故修改controller.js,注釋刪除掉內(nèi)部兩個ctrl的賦值語句蜕便。

controller.js

angular.module('app')
  .controller('MainCtrl', function ($scope) {
    $scope.title = "第一層";
  })
  .controller('AnotherCtrl', function ($scope) {
   // $scope.title = "第二層";
  })
  .controller('YetAnotherCtrl', function ($scope) {
   // $scope.title = "第三層";
  })

則對應的view輸出怎么會變?yōu)?/p>

<div ng-controller="MainCtrl" class="ng-scope ng-binding">
  第一層
  <div ng-controller="AnotherCtrl" class="ng-scope ng-binding">
      第一層
    <div ng-controller="YetAnotherCtrl" class="ng-scope ng-binding">
        第一層
    </div>
  </div>
</div>

YetAnotherCtrl與AnotherCtrl因為在自己的$scope中未對title屬性做復制,則會一層一層向父類$scope去調(diào)用贩幻,最后在MainCtrl中發(fā)現(xiàn)了title的并進行調(diào)用轿腺。

調(diào)用父類

回到最初如果3個Ctrl分別對title鍵值做出了賦值,我們需要顯式的在第三層中調(diào)用第一層的title值需要怎么做呢丛楚?

controller.js

angular.module('app')
  .controller('MainCtrl', function ($scope) {
    $scope.title = "第一層";
  })
  .controller('AnotherCtrl', function ($scope) {
    $scope.title = "第二層";
  })
  .controller('YetAnotherCtrl', function ($scope) {
    $scope.title = "第三層";
  })

view.html

<div ng-controller="MainCtrl">
  {{ title }}
  <div ng-controller="AnotherCtrl">
    {{ title }}
     {{$parent.title}}

    <div ng-controller="YetAnotherCtrl">
      {{ title }}
      {{$parent.title}}
    </div>
  </div>
</div>

我們需要通過$parent去直接操作當前$scope的父$scope去顯示其內(nèi)部的值族壳,根據(jù)以上代碼則會顯示如下的html結(jié)果

<div ng-controller="MainCtrl" class="ng-scope ng-binding">
  第一層
  <div ng-controller="AnotherCtrl" class="ng-scope ng-binding">
      第二層  第一層
    <div ng-controller="YetAnotherCtrl" class="ng-scope ng-binding">
        第三層  第二層
    </div>
  </div>
</div>

終極版

最后,如果我們?nèi)サ舻诙拥膖itle賦值語句將controller.js改成

angular.module('app')
  .controller('MainCtrl', function ($scope) {
    $scope.title = "第一層";
  })
  .controller('AnotherCtrl', function ($scope) {
   // $scope.title = "第二層";
  })
  .controller('YetAnotherCtrl', function ($scope) {
    $scope.title = "第三層";
  })

那么剛才最終獲得HTML會變成什么樣呢趣些?
答案是

<div ng-controller="MainCtrl" class="ng-scope ng-binding">
第一層
<div ng-controller="AnotherCtrl" class="ng-scope ng-binding">
第一層 第一層
<div ng-controller="YetAnotherCtrl" class="ng-scope ng-binding">
第三層 第一層
</div>
</div>
</div>
主要原理如下

  • 當?shù)谌龑覻etAnotherCtrl調(diào)用$scope.title的時候仿荆,因為YetAnotherCtrl中又對應的操作故最后獲取的是自己所賦值的字符串;
  • 當?shù)谌龑覻etAnotherCtrl調(diào)用$parent.title坏平。則$parent會先去查找Another中的$scope是否有title值拢操,結(jié)果是沒有的,故會再向上找舶替,找到MainCtrl中的title值令境。
  • 當?shù)诙覣notherCtrl調(diào)用$scope.title的時候,同理因為本身沒有故會向上查找顾瞪;

小結(jié)

$scope相當于給所有的controller提供了可繼承共享的上下文舔庶,很靈活,副作用是不好排錯陈醒、子類調(diào)用父類的代碼變得非常的不好理解栖茉,并且原型繼承天生有很多坑。
相關(guān)的文章可見官方一篇介紹$scope的專題:
https://github.com/angular/angular.js/wiki/Understan:ding-Scopes

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孵延,一起剝皮案震驚了整個濱河市吕漂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尘应,老刑警劉巖惶凝,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異犬钢,居然都是意外死亡苍鲜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門玷犹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混滔,“玉大人,你說我怎么就攤上這事∨饔欤” “怎么了油湖?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長领跛。 經(jīng)常有香客問我乏德,道長,這世上最難降的妖魔是什么吠昭? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任喊括,我火速辦了婚禮,結(jié)果婚禮上矢棚,老公的妹妹穿的比我還像新娘郑什。我一直安慰自己,他們只是感情好蒲肋,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布蘑拯。 她就那樣靜靜地躺著,像睡著了一般肉津。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舱沧,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天妹沙,我揣著相機與錄音,去河邊找鬼熟吏。 笑死距糖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的牵寺。 我是一名探鬼主播悍引,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帽氓!你這毒婦竟也來了趣斤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黎休,失蹤者是張志新(化名)和其女友劉穎浓领,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體势腮,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡联贩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捎拯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泪幌。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祸泪,到底是詐尸還是另有隱情吗浩,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布浴滴,位于F島的核電站拓萌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏升略。R本人自食惡果不足惜微王,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望品嚣。 院中可真熱鬧炕倘,春花似錦、人聲如沸翰撑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眶诈。三九已至涨醋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逝撬,已是汗流浹背浴骂。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪潮,地道東北人溯警。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像狡相,于是被迫代替她去往敵國和親梯轻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容