2013-06-25 89 views
0

首先感謝我的英文。 我的問題是:angular:ng-class中ng-repeater,重複呼叫

我這個簡單的代碼:

<li ng:repeat="item in menu.items" ng:class="getMenuItemClass(item)"> 
<a ng:href="#{{item.url}}">{{item.label}}</a> 
</li> 

,這我getMenuItemClass:

scope.getMenuItemClass = function(item) { 
    console.log(item) 
    var hashPath = $location.hashPath || '/'; 
    if (hashPath === item.url) { 
     return 'selected'; 
    } 
    return ''; 
}; 

這是現成的例子, 我不知道爲什麼,但在我的真實應用程序中,它一式三份! :0 有人可以向我解釋,如果我犯了一個錯誤?

http://jsfiddle.net/h7yKr/44/

我已經更新到jsfddle角的最後一個版本,現在它的一式四份! 觀看 http://jsfiddle.net/h7yKr/46/

編輯爲clarication: 問題是getMenuItemClass() 被稱爲多了很多次,然後要求, 嘗試打開的jsfiddle並打開瀏覽器控制檯和觀看的console.log!

+0

我沒有看到任何被三倍或四倍的東西 - 我只看到兩個菜單選項Home和Alt。你能否進一步澄清? – blaster

+0

對不起!你是對的,問題是getMenuItemClass() 被調用的次數要多得多,嘗試打開jsfiddle並打開瀏覽器控制檯並觀察console.log! – justBorn

回答

0

角度可以在digest週期內多次評估表達式,因此函數的執行會一次又一次地發生。

documentation解釋這裏

角進入$消化循環。該循環由兩個處理$ evalAsync隊列和$ watch列表的較小的 循環組成。 $ digest 循環不斷循環,直到模型穩定爲止,這意味着 $ evalAsync隊列爲空,並且$ watch列表未檢測到任何 更改。

由於$ watch表達式是一個函數,它可以稱爲多次。

或者看$routeChangeStart事件$route服務。 您可以訂閱此事件。 在你的示波器上創建一個變量,並對該變量執行ng-class綁定

+0

是的,是消化循環..我改變了做法;) – justBorn