2014-09-26 43 views
4

我有一個菜單小部件,其中每個菜單項可以展開到另一個子菜單。東西類似:http://plnkr.co/MGqCkAFUexSzSfcwthu5?p=preview方法返回href被調用ng-href被調用

鏈接標記是:

<a class="link-class" 
    ng-href={{ getLink(item) }} 
    ng-style="setTextAlignment(level)"> 
    {{ item.name }} 
</a> 

隨着控制器中定義的下述方法:

/** 
* @param {!angular.Scope} scope The scope of the directive. 
* @param {!Object} item The menuitem. 
* @return {string} Whether current user can access item. 
* @private 
*/ 
CollapsibleSubMenu.getLink_ = function(scope, item) { 
    console.log('link called'); 
    return item['subMenu'] ? '' : item['link']; 
}; 

所以基本上,如果項具有子菜單(子菜單== = true),它不應該有一個href(但是來自後端的項目數據具有子菜單項:true和一個有效的鏈接,這對於舊的菜單實現是可以的。)

現在的問題是,儘快菜單項出現在屏幕上,我可以看到console.log打印消息的鏈接每秒鐘左右調用。一旦檢索到的項目對象不會改變。那麼爲什麼這個getLink方法被頻繁調用呢?

回答

2

Angular使用髒檢查而不是使用observable,這意味着每當執行$digest循環時,您的函數也會因爲它不知道值是否已更改而變得太多。

如果你想看到這個動作,只需在代碼片段的框中輸入內容,然後點擊按鈕來查看你的函數實際被調用了多少次。

angular.module('myApp', []) 
 
.controller('myCtrl', ['$scope', function($scope){ 
 
    var numCalls = 0; 
 
    
 
    $scope.getConstantValue = function(){ 
 
    numCalls += 1; 
 
     
 
    return "Never gonna change"; 
 
    }; 
 
    
 
    $scope.getNumberOfCalls = function(){ 
 
    $scope.numCalls = numCalls; 
 
    }; 
 
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="myApp" ng-controller="myCtrl"> 
 
    <input type="text" ng-model="myInput" /> 
 
    <p>Number of calls: {{numCalls}}</p> 
 
    <p>{{getConstantValue()}}</p> 
 
    <button type="button" ng-click="getNumberOfCalls()">Update Call Count</button> 
 
</div>

+0

好了,所以這是否意味着在每一個範圍的方法將被調用每一個消化週期?如果我直接將方法條件與插值指令一起使用,那麼(錯誤地)如下所示: 'ng-href = {{item ['subMenu'] &&''||] item ['link']}}' 這會提高性能嗎? – abhink 2014-09-26 03:47:56

+0

如果它是一個函數,那麼是的...它會被調用每一個'$ digest'循環。這是因爲Angular必須知道值是否已經改變,並且唯一的方法就是執行該函數。如果你想避免這種情況,那麼你應該預先計算結果並將它們保存到一個可以綁定的變量中。 – Josh 2014-09-26 13:04:01