參考地址 https://docs.angularjs.org/api/ng/type/$rootScope.Scope
angular 的scope一般上都是有繼承關系的,也就是說可以通過原型訪問到父親屬性.
原型可以參考 http://www.cnblogs.com/keatkeat/p/3896758.html
$rootScope 提過了一些方法, 當然子scope也都繼承了這些方法
$rootScope.new(isolate)
isolate 是 boolean ,中文翻譯是隔離 。 也就是說創建一個$scope但是不要繼承父親
這個我們在寫指令的時候通常會使用上。
$watch(watchExpression, listener, [objectEquality], [deregisterNotifier])
watch 就是屬性監聽。第一個參數是要監聽的屬性名字,參數2是回調事件
一般上我們都是監聽$scope上的屬性,但是如果你想監聽一個普通的變量,可以這么寫 $scope.$watch(function(){ retrun some var },listener)
var scope = $rootScope; scope.name = 'misko'; scope.counter = 0; expect(scope.counter).toEqual(0); scope.$watch('name', function(newValue, oldValue) {
if(newValue === oldValue) { //do init } scope.counter = scope.counter + 1; }); expect(scope.counter).toEqual(0); scope.name = 'alibaba' //在還沒有digest前,修改關注的值是沒有意義的! scope.$digest(); // the listener is always called during the first $digest loop after it was registered expect(scope.counter).toEqual(1);
注意紅色的字,監聽之后的第一個digest一定會觸發一次監聽回調,我們可以在回調中判斷來做一下初始化,只有第一次會這樣,接下來只有當數據changed才會觸發回調。
在還沒有digest的情況下不要去修改你關注的值,那是沒有效果的 ,它就好比你把這個改變值的代碼寫在還沒有watch之前,angular的watch要配合digest才管用,這個一般js的getter setter 手法不同。
var scope = $rootScope; scope.name = 'misko'; scope.counter = 0; scope.$watch('name', function(newValue, oldValue) { //newValue = ""; 這里回事 alibaba,這不是我們要的!!! });
scope.name = 'alibaba' scope.$digest();
第3參數是 boolean , 是說要不要使用angular.equals來進行value is_change的對比方式, 沒有用過,應該是和c#差不多,就是對比object的時候是比引用還是比值。
第4參數是 function , 每次$digest(),都會觸發一次,不管值有沒有改變。(這個是1.3才有的)
$watchGroup(watchExpressions, listener);
多個屬性監聽,但是回調相同的情況下可以使用 , 參數1是 Array<String | Function>
$watchCollection(obj, listener);
這個用來監聽array或者object的改變,比如 array.push ,obj["x"] = x , 添加新的屬性或值的情況。
$digest()
執行臟數據監測,dirty check , angular內有很多時候都是自動執行的,manual 執行可以寫 $rootScope.$digest()
$destroy();
刪除$scope和其子$scope , 所有監聽都會清空.
$eval([expression], [locals]);
eval 和 js 的eval 類似,是angular自己寫的javascript語法解析器,很有心啊,一堆正則一堆 if else.
參數2可以讓我們傳入scope, 來處理表達式,返回結果.
$apply([exp])
$apply(fn) , fn 跑完會自動觸發 $rootScope.$digest();
一般上我們自己管理好 $digest()就行了
$on 和 $emit
$scope 就好比 elem , 可以把 on,emit 看做是游覽器的事件機制。
當你在一個上層的scope綁定了一個事件, 在子層可以調用 $emit來觸發,從而傳入子層的scope給父層 .
app.controller("ctrl", ["$scope", "$rootScope", function ($scope, $rootScope) { $scope.name = "1782"; $scope.$on("wawa", function (event, x) { alert(event.targetScope.name); alert(event.currentScope.name); }); }]); app.controller('ctrl2', ["$scope", "$rootScope", function ($scope, $rootScope) { $scope.name = "5566"; $scope.$emit("wawa"); }]);
event 是個對象,里面有 targetScope,currentScope,name(事件名字),stopPropagation 方法(調用它阻止冒泡),
preventDefault
方法(調用它注重默認事情,不是很理解),
defaultPrevented
- {boolean}
: true if preventDefault
was called. 這個也了解.
event之后的參數就是$emit時候任意傳入的
$broadcast(name, args);
上層scope向子層發布事件,反向理解就可以了。