AngularJS是Google研發的一款優秀的前端JS架構,是為了克服HTML在建構應用上動态性不足而設計的,現已經被用于Google的多款産品當中。
通常,我們使用以下方法來解決靜态網頁技術在建構動态應用上的不足:
類庫 - 類庫是一些函數的集合,它能幫助你寫WEB應用。通過在自己的核心代碼中調用類庫的方法,實作某種功能,例如:jQuery等。
架構 - 架構是一種特殊的、已經實作了的WEB應用,你隻需要套用該架構并對它進行具體的邏輯填充即可。這裡架構是起主導作用的,由它來根據具體的應用邏輯調用你的代碼。架構有:knockout、sproutcore等。
AngularJS使用了不同的方法,它嘗試去補足HTML本身在建構應用方面的缺陷。AngularJS通過使用我們稱為辨別符(directives)的結構,讓浏覽器能夠識别新的文法。AngularJS最為核心的特性就是:MVC、自動化雙向資料綁定、子產品化、路由、語義化标簽等等。
1、AngularJS MVC
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計建立 Web 應用程式的模式。
AngularJS程式的MVC分為3部分:模闆(View),表現層邏輯(Controller),資料(Model)。
1)模闆:
是我們用HTML、CSS寫的UI視圖代碼,其中包含AngularJS的指令、表達式,這些指令、表達式幫助你映射model到view的内容。
AnjularJS的機制就是:HTML模闆被浏覽器解析到DOM中。DOM然後成為AngularJS編譯器的輸入。AngularJS将會周遊DOM模闆來生成一些指令。所有的指令都負責針對view來設定資料綁定。使用DOM作為輸入,而不是字元串,是AngularJS差別于其它的架構的最大原因。使用DOM允許你擴充指令詞彙并且可以建立你自己的指令,甚至開發可重用的元件。AngularJS的指令後面将會再詳細做一介紹。
說到AngularJS編譯機制就不得不說一下DOM。DOM檔案對象模型(Document Object Model),是w3c組織推薦的處理可擴充标志語言的标準程式設計接口。要改變頁面的某個東西,JavaScript 就需要獲得對 HTML 文檔中所有元素進行通路的入口。這個入口,連同對 HTML 元素進行添加、移動、改變或移除的方法和屬性,都是通過文檔對象模型DOM來獲得的。
2)表現層邏輯(控制器):
包括應用程式邏輯和行為。用javascript定義,作為視圖控制器邏輯。在控制器中我們無需添加對于DOM級的事件監聽,這些在AngularJS中已經内置了。在UI節點DOM事件發生後(例如點選button事件),AngularJS會自動轉到scope上的某個行為(Action)邏輯上(即自動通過内置DOM進行事件擷取,然後找到對應的scope範圍,進行JS函數邏輯應用)。
3)資料:
視圖對象(viewobject)需要被AngularJS Scope引用,可以是任何類型的javascript對象、數組、基本類型對象。并且AngularJS會自動異步更新模型,即在UI發生改變時它會自動重新整理模型(mode),反之在模型發生改變的時候也會自動重新整理UI。在這裡我們不需要定義形如getter,setter的一系列方法。AngularJS可以通過雙向資料綁定自動從擁有JavaScript對象(模型)的UI(視圖)中同步資料。
2、自動化雙向資料綁定
<input class="inputheight" ng-model="activity_name" type="search">
<button class=" btn btn-primary btn-lg btn-block" ng-click="create_Activity()" ng-disabled="!activity_name">
雙向資料綁定指的就是,綁定對象屬性的改變到使用者界面的變化的能力,反之亦然。在這裡使用指令ng-model建立了一個資料模型"activity_name",并與所在的标簽“input”雙向綁定,無論什麼時候界面輸入的值發生變化,所對應的資料模型也發生了改變(比如$scope.activity_name的值會跟着輸入的資料而改變)。反之,使用"activity_name"屬性作為ng-disabled的屬性值,當$scope.activity_name的值改變時(有值沒值),就會以button是否可點表現在界面UI 上。
雙向資料綁定指令提供了Model投射到View的方法,傳統情況下,當Model變化時, 開發人員需要手動處理DOM元素并且将屬性反映到這些變化中。這是一個雙向的過程,一方面,Model變化驅動了DOM中元素變化,另一方面,DOM元素的變化也會影響到Model。
3、路由機制
ng的路由機制是靠ngRoute提供的,通過hash和history兩種方式實作了路由,可以檢測浏覽器是否支援history來靈活調用相應的方式。ng的路由(ngRoute)是一個單獨的子產品,每一個使用的子產品都要進行引用,下面的應用引用了6個子產品。形式如下:
angular
.module('yoDemoApp', [
'ngAnimate',
'ngCookies',
'ngResource',
'ngRoute',
'ngSanitize',
'ngTouch'
])
路由子產品包含以下内容:
服務$routeProvider用來定義一個路由表,即位址欄與視圖模闆的映射
.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/activity_list.html',
controller: 'activity_listCtrl'
})
});
服務$routeParams儲存了位址欄中的參數,例如{id : 1, name : 'tom'}
服務$route完成路由比對,并且提供路由相關的屬性通路及事件,如通路目前路由對應的controller
指令ngView用來在主視圖中指定加載子視圖的區域
在index.html中使用
<div ng-view=""></div>
來加載。以上内容再加上$location服務,我們就可以實作一個單頁面應用了。
具體跳轉機制:
1)引入檔案和依賴
<script src="http://code.angularjs.org/1.2.5/angular.min.js"></script>
<script src="http://code.angularjs.org/1.2.5/angular-route.min.js"></script>
并在子產品中聲明中注入對ngRoute的依賴
angular
.module('yoDemoApp', [
'ngRoute'
])
2)定義路由表
$routeProvider提供了定義路由表的服務,它有兩個核心方法,when(path,route)和otherwise(params),
.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/activity_list.html',
controller: 'activity_listCtrl'
})
});
3)整個路由查找過程
我們通過$location.path頁面跳轉方法将跳轉的路徑跟路由表中的進行比對,比如比對“/“,找到對應的‘/’,在目前模闆上執行的controller函數,生成新的scope,而templateUrl這一部分就會被ng-view所引用,我們的子視圖将會在此處被引入跳轉進來。otherwise(params)方法對應路徑比對不到時的情況,這時候我們可以配置一個redirectTo參數,讓它重定向到404頁面或者是首頁。
.otherwise({
redirectTo: '/'
});
4、AngularJS指令屬性和标記
“ 指令屬性”就是綁定在DOM元素上的函數,它可以調用方法、定義行為、綁定controller及$scope對象、操作DOM,等等。當浏覽器啟動、開始解析HTML(像平時一樣)時,DOM元素上的指令屬性就會跟其他屬性一樣被解析。當一個Angular.js應用啟動,Angular編譯器就會周遊DOM樹(從有ng-app指令屬性的那個DOM元素開始),解析HTML,尋找這些指令屬性函數。
1)ng-model指令屬性
ng-model指令屬性被用來将DOM的屬性值與Controller裡的$scope model綁定起來。具體的實作過程,是在這個值上綁定了一個$watch函數(類似JavaScript裡的事件監聽函數)。$watch函數(在使用時)運作在Angular.js的事件循環(即$digest循環)裡,讓Angular.js能夠對DOM進行相應的更新。
2){{ 表達式 }}标記
這個雙大括号指令屬性,使用$watch()函數,給括号内的表達式注冊了一個監聽器。正是這個$watch函數,讓Angular.js能夠實時自動更新view。
3)ng-show / ng-hide
ng-show和ng-hide指令,根據賦予它們的表達式的值的真假性(truthy),來顯示和隐藏它們所屬的那一部分DOM。
4)ng-app
ng-app聲明了Angular管理的邊界,隻需查找對應的ng-app所在的标簽。獲得Angular管理的範圍。
5)ng-repeat
在第一張卡小結時就介紹過ng-repeat,這裡再進行一下說明。在自己的scope中定義一個數組(model)來儲存資料,然後使用 ng-repeat 将它與 DOM 綁定,進行周遊,實作清單。