angular中directive的scope理解

說明

指令裏有個scope屬性,可以用來設置指令的作用域和數據共享,分開來看

作用域:

1> 有自己的作用域
     1)全面繼承父級的。
     2)詳細的設置,是單向或者雙向的。
2> 沒有

數據:

    屬性和方法
    遵循:基本類型是值傳遞,引用類型是地址的傳遞。
    方法推薦用通信(事件)的方式來做,可以避免指針誤操作的問題。

詳細介紹

默認值 scope:false

不會有自己的作用域,即是直接使用父級的scope裏的值。

scope:true

創建自己的作用域,同時繼承父級scope裏的值,即等同於從父級拿到初始值,修改它,不會改變父級scope裏的值。(和ng-controller的不太一樣,後面有提到)

scope:{}

完全獨立的作用域($rootScope都拿不到),通過三種模式 = & @同父級scope交互。
1、= 雙向綁定 寫法是

<demo a="aa"></demo>

父子組件都需對同一數據做操作,且要數據保持統一。如果不需要,可以用單向的。
2、@ 單向綁定 寫法是

<demo b="{{bb}}"></demo>

單向的數據可以做初始值,和使用值。
分二種情形:
1 單純使用,不要在組件裏對他修改,因爲他會受到原數據影響,父域更改後組件裏會丟失,然後自動被父域值覆蓋!
2 做初始值,但只能用第一次的值,以後就沒有干係。這樣兩邊都可以做修改。有其他需求要同步數據時,可以通信一下。
3、& 函數方法綁定 寫法是

<demo c="cc()"></demo>

注意:這裏只是能執行父的方法,沒法傳遞參數數據過去。

那麼像上面這樣scope裏就是:

scope:{
    a:'=',
    b:'@',
    c:'&'
}

aa,bb,cc都是父級scope裏的值。

另外,指令的這裏定義指令的名字是駝鋒命名的,在html裏要轉成中劃線鏈接的,如 指令名是 aBc ,那麼 html裏要寫成<a-bc> <a-bc>,屬性值綁定也遵守這個規則,大寫字母替換成 ‘中劃線+小寫’,如,ABC,就要寫成<a-b-c><a-b-c>。

附:作用域繼承時的關係:
在子裏修改引用類型的值是會同時改變父子的值,推薦的寫法是推薦寫成引用類型的?這樣也不太好。。
可以測下代碼:

<h1>父作用域:</h1>
<p>{{a}}</p>
 <p>{{b}}</p>
 <p>{{c.str}}</p>
 <p>{{d.str}}</p>
 <div ng-controller="MyController">
     <h1>子作用域:</h1>
     <p>{{a}}</p>
     <p>{{b}}</p>
     <p>{{d.str}}</p>
 </div>
$rootScope.a= 'a的默認值,父修改會影響所有的子級';
$timeout(function(){
  $rootScope.a = '父級a改變了,子級也跟着變了';
},2000);

$rootScope.b= 'b的默認值,子級修改不會影響父級';
$timeout(function(){
  $scope.b = '子級b改變了,不會影響父級';
},2000);

$rootScope.c= {str:'c的默認值,子級修改會影響父級,因爲是引用類型'};
$timeout(function(){
  $scope.c.str='子級c改變了,會影響父級,因爲是引用類型';
},2000);

$rootScope.d= {str:'d的默認值,子級修改會影響父級,因爲是覆蓋'};
$timeout(function(){
  $scope.d={str:'子級d改變了,不會影響父級,因爲是覆蓋'};
},2000);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章