經過使用模板,咱們能夠把model和controller中的數據組裝起來呈現給瀏覽器,還能夠經過數據綁定,實時更新視圖,讓咱們的頁面變成動態的。ng的模板真是讓我愛不釋手。學習ng道路還很漫長,從模板開始入手是個不錯方式,由於這部份內容相對簡單好理解,並且是視圖層的東西,你們都喜歡能夠立馬看得見的東西嘛。本篇我將蒐羅模板中的經常使用指令一一測試,瞭解其使用方法,有點像背單詞的感受,會比較枯燥。不過對於初學,這樣的枯燥是必需要經歷的,開始~javascript
模板中可使用的東西包括如下四種:css
其中,指令無疑是使用量最大的,ng內置了不少指令用來控制模板,如ng-repeat,ng-class,也有不少指令來幫你完成業務邏輯,如ng-controller,ng-model。過濾器一般是伴隨標記來使用的,將你model中的數據格式化爲須要的格式。表單的控制功能主要涉及到數據驗證以及表單控件的加強。html
在這裏有必要說明一下表達式的概念,畢竟咱們模板中大部分使用的都是變量。ng中的表達式與javascript表達式相似可是不能夠劃等號,它是ng本身定義的一套模式。表達式能夠做爲指令的值,如ng-modle=」people.name」、ng-click=」showMe()」,看起來是如此像字符串,故而也叫字符串表達式。也能夠在標記中使用表達式,如{{1+2}},或者與過濾器一塊兒使用{{1+2 | currency}}。在框架內部,字符串不會簡單的使用eval()來執行,而是有一個專門的$parse服務來處理。在ng表達式中不可使用循環語句、判斷語句,事實上在模板中使用複雜的表達式也是一個不推薦的作法,這樣視圖與邏輯就混雜在一塊兒了。java
既然模板就是普通的HTML,那我首要關心的就是樣式的控制,元素的定位、字體、背景色等等如何能夠靈活控制。下面來看看經常使用的樣式控制指令。angularjs
1. ng-classapi
ng-class用來給元素綁定類名,其表達式的返回值能夠是如下三種:數組
1) 類名字符串,能夠用空格分割多個類名,如’redtext boldtext’;瀏覽器
2) 類名數組,數組中的每一項都會層疊起來生效;app
3) 一個名值對應的map,其鍵值爲類名,值爲boolean類型,當值爲true時,該類會被加在元素上。框架
下面來看一個使用map的例子:
若是你想拼接一個類名出來,可使用插值表達式,如:
<div class=」{{style}}text」>字體樣式測試</div>
而後在controller中指定style的值:
$scope.style = ‘red’;
注意我用了class而不是ng-class,這是不能夠對換的,官方的文檔也未作說明,姑且認爲這是ng的語法規則吧。
與ng-class相近的,ng還提供了ng-class-odd、ng-class-even兩個指令,用來配合ng-repeat分別在奇數列和偶數列使用對應的類。這個用來在表格中實現隔行換色再方便不過了。
2. ng-style
ng-style用來綁定元素的css樣式,其表達式的返回值爲一個js對象,鍵爲css樣式名,值爲該樣式對應的合法取值。用法比較簡單:
<div ng-style="{color:'red'}">ng-style測試</div> <div ng-style="style">ng-style測試</div> $scope.style = {color:'red'};
3. ng-show,ng-hide
對於比較經常使用的元素顯隱控制,ng也作了封裝,ng-show和ng-hide的值爲boolean類型的表達式,當值爲true時,對應的show或hide生效。框架會用display:block和display:none來控制元素的顯隱。
對於經常使用的表單控件功能,ng也作了封裝,方便靈活控制。
ng-checked控制radio和checkbox的選中狀態
ng-selected控制下拉框的選中狀態
ng-disabled控制失效狀態
ng-multiple控制多選
ng-readonly控制只讀狀態
以上指令的取值均爲boolean類型,當值爲true時相關狀態生效,道理比較簡單就很少作解釋。注意: 上面的這些只是單向綁定,即只是從數據到模板,不能副作用於數據。要雙向綁定,仍是要使用 ng-model
。
事件綁定是javascrpt中比較重要的一部份內容,ng對此也作了詳細的封裝,正如咱們以前使用過的ng-click同樣,其餘事件的指令以下:
ng-change
ng-dblclick
ng-mousedown
ng-mouseenter
ng-mouseleave
ng-mousemove
ng-mouseover
ng-mouseup
ng-submit
事件綁定指令的取值爲函數,而且須要加上括號,例如:
<select ng-change=」change($event)」></select>
而後在controller中定義以下:
$scope.change = function($event){ alert($event.target); //…………………… }
在模板中能夠用變量$event將事件對象傳遞到controller中。
對於ng的這種設計,一些人有所質疑,視圖與事件綁定混在一塊兒到底好很差?咱們不是要講究視圖與邏輯分離嗎?如此一來,把事件的綁定又變回了內聯的,豈不是歷史的倒退。我也同樣對此表示不解,由於不寫onclick已經不少年。。。但既然已經存在了,咱們不妨往合理的方向上想想,或許ng的設計者壓根就不想讓模板成爲單純的視圖層,原本就是想加強HTML,讓它有一點業務能力。這麼想的話彷佛也能想通,好吧,先欺騙一下本身吧~
在說明這兩個指令的特殊以前,須要先了解一下ng的啓動及執行過程,以下圖:
1) 瀏覽器加載靜態HTML文件並解析爲DOM;
2) 瀏覽器加載angular.js文件;
3) angular監聽DOMContentLoaded
事件,監聽到時開始啓動;
4) angular尋找ng-app指令,肯定做用範圍;
5) 找到app中定義的Module使用$injector服務進行依賴注入;
6) 根據$injector服務建立$compile服務用於編譯;
7) $compile服務編譯DOM中的指令、過濾器等;
8) 使用ng-init指令,將做用域中的變量進行替換;
9) 最後生成了咱們在最終視圖。
能夠看到,ng框架是在DOMcontent加載完畢後纔開始發揮做用。假如咱們模板中有一張圖片以下:
<img src=」{{imgUrl}}」 />
那麼在頁面開始加載到ng編譯完成以前,頁面上會一直顯示一張錯誤的圖片,由於路徑{{imgUrl}}還未被替換,就像這樣:
爲了不這種狀況,咱們使用ng-src指令,這樣在路徑被正確獲得以前就不會顯示找不到圖片。同理,<a>標籤的href屬性也須要換成ng-href,這樣頁面上就不會先出現一個地址錯誤的連接。
順着這個思路再多想一點,咱們在模板中使用{{}}顯示數據時,在ng編譯完成以前頁面上豈不是會顯示出大括號及裏面的表達式?確實是這樣。爲了不這個,ng中有一個與{{}}等同的指令:ng-bind,一樣用於單向綁定,在頁面剛加載的時候就不會顯示出對用戶無用的數據了。儘管這樣你可能不但沒舒心反而更糾結了,{{}}那麼好用易理解,還不能用了不成?好消息是咱們依然可使用。由於我編寫的是單頁面應用,頁面只會在加載index.html的時候出這個問題,只需在index.html中的模板中換成ng-bind就行。其餘的模板是咱們動態加載的,就能夠放心使用{{}}了。
枯燥的內容終於寫完!~在寫這篇文章以前我就在糾結,寫這樣的內容是否是有點多餘,由於這些東西在angular官網(http://docs.angularjs.org/api/)一看就明白,並且在線示例也寫的很棒。本着不急於求成的原則我仍是決定先把這些東西都試一試吧,因此就有詳有略的介紹了以上內容,必要的時候也能夠當一個備忘。
學英語有兩種方法,一種是先作題,遇到不會的單詞再查,另外一種是先拿着單詞本背。儘管專家好像更推薦前者,但若是你如今一竅不通,仍是老老實實先背單詞吧~