angularjs的雙向繫結詳解
雙向資料繫結可能是AngularJS最實用的特性,將MVC的原理展現地淋漓盡致。
AngularJS的工作原理是:
HTML頁面的載入,這會觸發載入頁面包含的所有JS (包括 AngularJS)
AngularJS啟動,搜尋所有的指令(directive)
找到ng-app,搜尋其指定的模組(Module),並將其附加到ng-app所在的元件上。
AnguarJS遍歷所有的子元件,查詢指令和bind命令
每次發現ng-controller或者ng-repeart的時候,它會建立一個作用域(scope),這個作用域就是元件的上下文。作用域指明瞭每個DOM元件對函式、變數的訪問權。
AngularJS然後會新增對變數的監聽器,並監控每個變數的當前值。一旦值發生變化,AngularJS會更新其在頁面上的顯示。
AngularJS優化了檢查變數的演算法,它只會在某些特殊的事件觸發時,才會去檢查資料的更新,而不是簡單地在後臺不停地輪詢。
它雙向繫結的操作如下:
資料 (M)→ 介面(V):控制器(C)僅僅負責在編譯時在scope物件上建立檢視物件vm,檢視物件和模板的繫結則是由 scope負責管理的。
介面(V) → 資料(M):介面的操作可以觸發我們控制器(C)裡定義的方法,從而改變資料(M).再通過上面的M→ V繫結回檢視
結合下面的這個例項,詳細解釋雙向繫結(例項來自匯智網Angular進階教程)
控制器對scope的影響
ng-controller指令總是建立一個新的scope物件,而且只在頁面載入時執行一次:
初始化$scope物件
var ezControllerClass = function($scope){
//view model
$scope.vm = {
sb : {
name : "Jason Stantham",
gender : "male",
age : 48,
career : "actor",
photo : "http://b.hiphotos.baidu.com/baike/w%3D268/sign=a03742145bee3d6d22c680cd7b176d41/359b033b5bb5c9eae4c45250d739b6003af3b34a.jpg"
}
};
};
angular.module("ezstuff",[])
.controller("ezController",ezControllerClass);
利用上面的程式碼我們將檢視模型初始化
最後,向cope物件新增方法
業務模型是動態的,在資料之外,我們需要給業務模型新增動作。
雖然控制器只加載一次,但我們可以在控制器中定義一些方法來改變資料模型,從而改變檢視。
在之前建立的業務模型上,我們建立一個方法:shuffle,這個方法負責 從一個小型的名人庫中隨機的選擇一個名人來更新模型的sb屬性:
通過在button上使用ng-click指令,我們將模型的shuffle方法繫結到了滑鼠點選 事件上。試著用滑鼠點選【shuffle】按鈕,我們的模型將從庫裡隨機的選出一個 名人,顯示在視圖裡。