詳解JavaScript的AngularJS架構中的運算式與指令_AngularJS

來源:互聯網
上載者:User

“指令屬性”就是綁定在DOM元素上的函數,它可以調用方法、定義行為、綁定controller及$scope對象、操作DOM,等等等等。

當瀏覽器啟動、開始解析HTML(像平時一樣)時,DOM元素上的指令屬性就會跟其他屬性一樣被解析。

當一個Angular.js應用啟動,Angular編譯器就會遍曆DOM樹(從有ng-app指令屬性的那個DOM元素開始,如我們在本系列第一篇裡所提過的),解析HTML,尋找這些指令屬性函數。

當在一個DOM元素上找到一個或多個這樣的指令屬性函數,它們就會被收集起來、排序,然後按照優先順序順序被執行。

每個指令屬性都有自己的優先順序,在我們關於指令屬性的專題文章裡(http://www.ng-newsletter.com/posts/directives.html),你可以找到更深入的資訊。

Angular.js應用的動態性和響應能力,都要歸功於指令屬性。之前我們已經看過一些指令屬性的用例:

ng-model

<input ng-model="name" name="Name" placeholder="Enter your name"/><h4>Your name: {{ name }}</h4>

試試看

ng-model指令屬性(我們在之前的章節使用過它),被用來將DOM文本輸入框的值,跟controller裡的$scope model綁定起來。具體的實現過程,是在這個值上綁定了一個$watch函數(類似JavaScript裡的事件監聽函數)。

$watch函數(在使用時)運行在Angular.js的事件迴圈(即$digest迴圈)裡,讓Angular.js能夠對DOM進行相應的更新。請關注我們關於$digest迴圈的進階文章!

在Angular.js應用的開發中,我們用指令屬性來將行為綁定到DOM上。指令屬性的使用,是一個 應用能否擁有動態性、響應能力的關鍵。Angular.js提供了很多預設的指令屬性,現在讓我們來看看其中幾個,以及如何使用它們。

幾個常見的指令屬性:

{{ 運算式 }}

這個雙大括弧指令屬性,使用$watch()函數,給括弧內的運算式註冊了一個監聽器。正是這個$watch函數,讓Angular.js能夠即時自動更新view。

那麼,到底什麼算是個運算式?
要想理解指令屬性的運作,我們必須先理解運算式,所以這裡我們就繞個路,看看本系列的第五部分——運算式。在之前的例子裡我們已經見過運算式,例如 {{ person.name }} 和 {{ clock }}。

{{ 8 + 1 }}9{{ person }}{"name":"Ari Lerner"}{{ 10 * 3.3 | currency }}$33.00

最後的例子裡 (10 * 3.3 | currency) 用了一個過濾器。本系列之後的部分,會深入介紹過濾器。

運算式粗略來看有點像 eval(javascript) 的結果。它們會經過Angular.js的處理,從而擁有以下重要而獨特的性質:

所有運算式都在scope這個context裡被執行,因此可以使用所有本地 $scope 中的變數。
如果一個運算式的執行導致類型錯誤或引用錯誤,這些錯誤將不會被拋出。
運算式裡不允許任何控制函數流程的功能(如if/else等條件陳述式)
運算式可接受一個或多個串聯起來的過濾器。
試試看

試試輸入“person“,“clock“或其他數學算式如2+4。你甚至可以操作scope,例如,試試輸入person.name = ”Ari”; person.age = 28; person 或 clock

運算式都運行在調用它們的scope裡,所以一個運算式可訪問並操作其scope上的一切。由此,你可以使用運算式遍曆其scope的屬性(我們在ng-repeat中會看到這一應用)、調用scope裡的函數,或者對scope中的變數進行數學運算。

現在,讓我們回到指令屬性…

ng-init

ng-init指令屬性是一個在啟動時啟動並執行函數(在程式進入運行階段之前)。它讓我們能夠在程式運行前設定初始變數的值:

<b ng-init='name = "Ari Lerner"'>Hello, {{ name }}</b>

試試看

Hello, Ari Lerner

ng-click

ng-click指令屬性給DOM元素註冊了一個點擊事件的監聽器。當此DOM元素上有點擊事件發生(即當此button或link被點擊時),Angular.js就會執行運算式的內容,並相應地更新view。

<button ng-click="counter = counter + 1">Add one</button>Current counter: {{ counter }}

試試看

我們也可以用ng-click 來調用在controller裡寫好並綁定在$scope上的函數,例如:

<button ng-click="sayHello()">Say hello</button>

controller 裡的函數:

app.controller('MyController', function($scope) {  $scope.sayHello = function() {   alert("hello!");  } });

試試看

ng-show / ng-hide

ng-show和ng-hide指令,根據賦予它們的運算式的值的真假性(truthy),來顯示和隱藏它們所屬的那一部分DOM。

我們在這裡不會深入,但你應該熟悉JavaScript中變數值的“truthy”和“falsy”概念。

<button ng-init="shouldShow = true" ng-click="shouldShow = !shouldShow">Flip the shouldShow variable</button> <div ng-show="shouldShow">  <h3>Showing {{ shouldShow }}</h3> </div> <div ng-hide="shouldShow">  <h3>Hiding {{ shouldShow }}</h3> </div>

ng-repeat

ng-repeat指令遍曆一個資料集合中的每個資料元素,載入HTML模版把資料渲染出來。被重複使用的模版元素,就是我們綁定了這個指令屬性的DOM元素。每一個使用模版渲染的DOM元素都有自己的scope。

在更多的解釋之前,我們先看一個例子。假設我們的controller裡有這樣一個資料元素的數組:

$scope.roommates = [  { name: 'Ari'},  { name: 'Q'},  { name: 'Sean'},  { name: 'Anand'} ];

在view裡我們可以用ng-repeat來遍曆這個集合裡的資料:

<ul>  <li ng-repeat="person in roommates">{{ person.name }}</li> </ul>

對賦予ng-repeat的運算式稍作改動,我們還可以用它遍曆一個由成對的key-value資料群組成的集合。例如,假設我們有一個人名和他們最喜歡的顏色的資料集合:

$scope.people = {  'Ari': 'orange',  'Q': 'purple',  'Sean': 'green' }

要遍曆它,我們可以給ng-repeat指令屬性賦予這個運算式: (key, value) in object:

<ul>  <li ng-repeat="(name, color) in people">{{ name }}'s favorite color is {{ color }}  </li> </ul>

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.