2015-11-04 42 views
2

我很難理解angularjs如何決定如何評估屬性。對於爲例,使用ng-repeatAngularjs屬性文字值與表達式評估

<div ng-repeat="item in items"></div> 

item in items部分將作爲表達進行評估,尋找items陣列中的控制器的某處設定的內容。

但使用ng-src

<img ng-src="/path/to/img/"></img> 

path/to/img/將被視爲一個文字。如果我要讓它「動態」我必須寫:

<img ng-src="/path/to/img/{{id}}"></img> 

其中id在控制器設置。

問題:如何在爲自定義指令定義自定義屬性時選擇遵循哪種行爲?

+0

閱讀文檔有助於 – charlietfl

回答

1

沒有什麼可供選擇的。屬性值中的表達式由$interpolate服務插值。後者使用$parse服務來評估字符串中的每個表達式。

某些指令(ng-if,ng-hide)除了表達屬性外,通常在API文檔中指定。在這種情況下,括號可以省略,表達式將在指令 - $scope.$watch is being used often內進行評估,而不是明確地調用$interpolate

ng-repeat屬性語法(它在文檔中被稱爲'repeat expression')由the directive itself解析並且與Angular表達式無關。

0

將表達式定義爲你的屬性將給你在指令鏈中的巨大可能性 - 你將逃避孤立範圍的錯誤,這使得我們所有人都瘋狂。一個特別鏈接ng-repeat或其他默認的。

我在引導代碼中看到並開始使用 - 在自己的作用域內的I $ eval表達式然後傳遞給指令局部變量而不是在隔離範圍中定義。

<div custom some-val='ctrl.data'></div> 

//directive link or controller 
var private = $scope.$eval($attrs.someVar); 

只有con e $ eval纔是它對靜態變量很好。對於動態,您需要已經評估過的值或最好的方法是將它放入可以在指令之間共享的ng-model(修復我,如果我錯了)

或者只運行watcher表達式的結果要簡單得多。

+0

爲什麼如此不利D: – Appeiron

+0

您可以自由檢查引導模板js中的任何模板。如果人們經常使用這種方法,並且他們正在使用這種沒有副作用的方法,那麼這可能是一個很好的解決方案。 – Appeiron