2013-04-21 7 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> 

私はトップループはわずか2回(ということを検証する)repetingことを知っているが、機能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; 
    } 
} 

}

あなたはそれが起こって、なぜ私が明確に助けることができます! thanks

答えて

9

AngularJSは、ダーティトラッキングを使用してビューを最新の状態に保ちます。つまり、AngularJSはビューのバインディングの値が安定するまで評価します。したがって、バインディングの関連するスコープが更新されるたびに、バインディングごとに少なくとも2回これを行います。たとえば、ループ内の特定の項目が変更された場合は、さらに2回実行される可能性があります。このため、ビューにバインドされた関数に副作用がなく、迅速に実行されるように注意する必要があります。

一般に、コントローラからロードされたときに実行されるコードまたはコントローラから呼び出されるサービスにデータ準備タスクを移動することは良い習慣です。ビューに関連するコードにはほとんど副作用がありません。ただし、ビューからこのような関数を呼び出す必要がある場合は、その関数が既にその項目に対して呼び出されているかどうかを確認するだけです。

ここにはadditional reading on dirty tracking in Angular if you're interestedのビットがあります。

関連する問題