說明
指令裏有個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);