2013-04-21 85 views
6

嗨,我有下一個問題:角度:從視圖調用函數

在我看來,我調用函數prepareDynamicData(itemMenu);

<div ng-repeat="itemMenu in menuDetailsData.categories" class="headDetails fontH2"> 
      <div style="display: none">{{prepareDynamicData(itemMenu)}}</div> 
      <a href="#" ng-show="dynamicData.expand">{{itemMenu.name}}</a> 
      <div ng-repeat="cat in dynamicData.data"> 
       <p>{{cat.name}}</p> 
       <div class="articles"> 
        <div ng-repeat="art in cat.items" class="article"> 
         <div class="price"> 
          <div></div> 
          <span><i>₪</i>{{art.price}}</span> 
         </div> 
         <div class="artDescr"> 
          <span class="fontTitle">{{art.title}}</span> 
          <p class="fontDetails">{{art.description}}</p> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 

我知道,上面的循環repeting只有2次(驗證),但功能prepareDynamicData(itemMenu)調用4次,不知道爲什麼!?這裏是我的控制器:

function MenuItemCtrl($scope, $routeParams, $http, $location, sharedData) { 
if (sharedData.getMenuDetails() == null) { 
    $location.path('/menu'); 
    return; 
} 
else { 
    $scope.menu = sharedData.getMenu(); 
    $scope.menuDetailsData = sharedData.getMenuDetailsData($routeParams.itemId); 
} 

$scope.dynamicData = { 
    data : new Array(), 
    expand : false 
}; 

$scope.prepareDynamicData = function (itemMenu) { 
    if (itemMenu.items != null) { 
     $scope.dynamicData.data[0] = itemMenu; 
     $scope.dynamicData.expand = false; 
    } 
    else { 
     $scope.dynamicData.data = itemMenu.categories; 
     $scope.dynamicData.expand = true; 
    } 
} 

}

你能幫我澄清一下,爲什麼它的發生!感謝

回答

9

AngularJS使用骯髒的跟蹤,以確保該視圖保持最新。這意味着AngularJS將評估你的視圖綁定的值直到它們穩定;因此,每當綁定的關聯作用域更新時,它就會每綁定至少執行兩次。 (例如,如果內部循環的特定項目發生變化,它可能會運行一個額外的兩次。)這就是爲什麼必須小心,以確保在視圖約束功能沒有任何副作用,快速運行。

一般情況下,移動數據準備任務爲代碼在運行控制器負載時,或成是從控制器調用的服務,是一個很好的做法 - 視圖相關的代碼應該很少有副作用!但是,如果你必須/真的要調用從視圖這樣的功能,簡單地跟蹤是否功能已呼籲給定項目。

這裏是有點additional reading on dirty tracking in Angular if you're interested