2013-04-21 36 views
6

Xin chào Tôi có vấn đề tiếp theo:Góc: chức năng gọi từ màn hình

Theo quan điểm của tôi, tôi gọi hàm là 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> 

Tôi biết rằng vòng lặp chỉ lặp lại 2 lần (đã xác minh), nhưng chức năng chuẩn bịDynamicData (itemMenu) gọi 4 lần, không biết tại sao !? Dưới đây là bộ điều khiển của tôi:

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; 
    } 
} 

}

bạn có thể giúp tôi làm rõ lý do tại sao nó đang xảy ra! thanks

Trả lời

9

AngularJS sử dụng theo dõi dơ bẩn để đảm bảo chế độ xem luôn được cập nhật. Điều đó có nghĩa là AngularJS sẽ đánh giá các giá trị của các ràng buộc của khung nhìn của bạn cho đến khi chúng ổn định; do đó, nó sẽ làm điều này ít nhất hai lần cho mỗi ràng buộc bất kỳ lúc nào mà các phạm vi liên quan của liên kết cập nhật. (Ví dụ, nếu một mục cụ thể bên trong vòng lặp thay đổi, nó có khả năng sẽ chạy thêm hai lần.) Đây là lý do tại sao phải cẩn thận để đảm bảo rằng các hàm bị ràng buộc trong khung nhìn không có tác dụng phụ và chạy nhanh.

Nói chung, chuyển các nhiệm vụ chuẩn bị dữ liệu sang mã chạy khi bộ điều khiển tải hoặc vào dịch vụ được gọi từ bộ điều khiển, là một thực hành tốt - xem mã liên quan hiếm khi có tác dụng phụ! Tuy nhiên, nếu bạn phải/thực sự muốn gọi một hàm như thế này từ khung nhìn, chỉ cần theo dõi xem hàm đó đã được gọi cho mục đã cho hay chưa.

Đây là một chút của additional reading on dirty tracking in Angular if you're interested.

Các vấn đề liên quan