anjularjs 表達式

表達式(Expressions)是類Javascript的代碼片段,通常放置在綁定區域中(如{{expression}})。表達式通過$parse服務(http://code.angularjs.org/1.0.2/docs/api/ng.$parse)解析執行。

  例如,以下是angular中有效的表達式:

  • 1+2

  • 3*10 | currency

  • user.name

 

一、Angular表達式 vs. Js 表達式

  這很容易讓人將angular視圖表達式聯想爲javascript表達式,但這並不完全正確,因爲angular不是通過javascripteval()對表達式進行求值。你可以將angular表達式想象爲帶有以下差異的javascript表達式:

  • 屬性求值:所有屬性的求值是對於scope的,而javascript是對於window對象的。

  • 寬容(forgiving):表達式求值,對於undefinednullangular是寬容的,但Javascript會產生NullPointerExceptions-_-!!!!怎麼我沒見過)。

  • 沒有流程控制語句:在angular表達式裏,我們不能做以下任何的事:條件分支、循環、拋出異常。

  • 過濾器(filters):我們可以就將表達式的結果傳入過濾器鏈(filter chains)。例如將日期對象轉換爲本地指定的人類可讀的格式。

  另一方面,如果我們想(在angular表達式中)執行任意的Javascript代碼,我們可以將那些代碼寫到Controller的一個方法中並調用它。如果我們想在javascripteval()一個angular表達式,可以使用$eval()方法。

二、屬性求值(Property Evaluation

  angular的表達式解析環境的上下文是scope,而javascript則是window(應該是指嚴格模式evel的時候),angular需要通過$window訪問global window對象。例如,如果我們需要在表達式中調用定義在window對象上的alert(),我們需要使用$window.alert()。這樣做的用意是避免意外訪問了公共屬性(global state)(一個同源的小BUGa common source of subtle bugs)。


三、Forgiving(寬容,容錯?)

  表達式求值對undefinednull是寬容的。在javascript中,當a不是object的時候,對a.b.c求值,那麼將會拋出一個異常。有時候這對於通用語言來說是合理的,而表達式求值主要用於數據綁定,一般形式如下:

`a`.`b`.`c`


 如果a不存在,沒有任何顯示似乎比拋出異常更加合理(除非我們等待服務端響應,不一會兒就會被定義)。如果表達式求值時不夠寬容,那麼我們如此混亂地寫綁定代碼:


四、沒有控制流程語句(No Control Flow Statements

  我們不可以在表達式中寫流程控制語句。背後的原因是,angular的核心體系是應用的邏輯應當在controller(的scope)裏面,而不是在view裏面。如果我們需要在視圖表達式中加入條件分支、循環或者拋出異常的話,可以委託javascript方法去代替(可以調用scope中的方法)。

 

五、過濾器(Filters

  當我們向用戶呈現數據時,我們可能需要將數據從原始格式轉換爲友好(可讀性強)的格式。例如,我們有一個數據對象需要在顯示給用戶之前根據地域進行格式化。我們可以將表達式傳遞給一連串的過濾器,如:

六、前綴”$”

  我們可能會感到奇怪,前綴”$”的意義是什麼?它是angular爲了使本身的API名稱能夠區別於其他的API而使用的一個簡單的前綴(防止衝突)。如果angular不使用$,那麼對a.length()求值將返回undefined。因爲aangular本身都沒有定義這個屬性。

  考慮到angular將來的版本可能會選擇增加length這個方法,這將令這個表達式的行爲發生改變。更糟糕的是,我們開發者可能會創建一個length屬性,那麼將與angular發生衝突。這個問題存在因爲angular通過增加方法擴展了當前存在的對象。通過加入前綴”$”,angular保留了特定的namespace,所以angular的開發者與使用angular的開發者都可以和諧共處。



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