$rootScope


參考地址 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向子層發布事件,反向理解就可以了。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM