Angular的一些知識點

作用域的聲明週期

瀏覽器接收到事件後的一般工作流程是執行一個相應的Javascript回調。回調一執行完,瀏覽器就會重新渲染DOM並且重新回到等待事件的狀態。

當瀏覽器調用AngularJS上下文之外的Javascript代碼時,AngularJS是不知道模型的更改的。要正確處理模型的更改,就要使用$apply方法進入AngularJS的執行上下文。只有在$apply方法內執行的模型修改纔會正確地被AngularJS處理。比如,一個指令監聽DOM事件,比如ng-click,它必須在$apply方法中來執行表達式。

執行完表達式之後,$apply會進入$digest階段。在$digest階段作用域會檢查所有的$watch表達式,並將它們和之前的值比較。這個檢查工作是異步執行的。這意味着賦值語句,如$scope.username="angular"不會馬上導致$watch被通知,取而代之的是它會等到$digest階段才被通知。這種方式是合理的,因爲它將多個模型的更新整合到一個$watch通知裏,並且保證了一個$watch通知期間不會有其他$watch執行。如果一個$watch改變了模型的值,那麼它會產生一個額外的$digest階段。

  1. 創建——根作用域是在應用被$injector啓動時創建的。在模板鏈接階段,有些指令會創建新的子作用域。2.觀察者註冊——在模板鏈接階段,指令會在作用域上註冊觀察者。這些觀察者是用來將模型的改變傳遞給DOM的。
  2. 模型變化——爲了正確地觀測到模型變化,你需要並且只能在scope.$apply()中改變他們。(AngularJS的API會隱式地這麼做,所以在控制器或者在$http,$timeout等服務中你不需要額外的調用$apply)。
  3. 變化的觀測——在$apply的最後,AngularJS會在根作用域中執行一個$digest循環,它會將變化傳遞給所有子作用域。在$digest循環中,所有的$watch表達式或者函數都會被檢測,來觀察模型的變化。如果有變化被檢測到了,$watch的監聽回調就會被調用。
  4. 作用域的銷燬——如果子作用域不再有用了。那麼子作用域的創建者就會負責用scope.$destroy() API來將它銷燬。這會停止$digest再調用子作用域,並且讓作用域佔用的內容能夠被回收。






每一個AngularJS應用都有一個注入器(injector)用來處理依賴的創建。注入器是一個負責查找和創建依賴的服務定位器。


等效的表示的自己需要的依賴的方法:

推斷依賴

最簡單的處理依賴的方法,就是假設函數的參數名就是依賴的名字

function MyController($scope, greeter) {
  ...
}

$inject 標記

要允許壓縮類庫重命名函數參數,同時注入器又能正確處理依賴的話,函數需要使用$inject屬性。這個屬性是一個包含依賴的名稱的數組。

var MyController = function(renamed$scope, renamedGreeter) {
  ...
}
MyController.$inject = ['$scope', 'greeter'];

行內標記

有時候用$inject標記不是很方便,比如用來聲明指令的時候。

比如:

someModule.factory('greeter', function($window) {
  ...;
});

使用$inject會導致代碼膨脹:

var greeterFactory = function(renamed$window) {
  ...;
};

greeterFactory.$inject = ['$window'];

someModule.factory('greeter', greeterFactory);

這種情況我們就推薦使用第三種方式

someModule.factory('greeter', ['$window', function(renamed$window) {
  ...;
}]);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章