2014-09-18 14 views
0

我正在使用我的應用程序的restangular。說我有這個在我看來:在ng-show中的角度函數,承諾會出錯

<div ng-repeat="resource in resources"> 
    <i ng-show="isCheckedLabel(resource)" class="fa fa-checked"> Checked </i> 
</div> 

,並在我的控制,我有我的API調用服務

$scope.getResources = function(){ 
    $scope.getResourcePromise = ResourceService.getResourceById($stateParams.id).then(function(response){ 
     $scope.resources = response; 
    }); 
}; 

,這裏是我的檢查功能,這將返回true或false

$scope.isCheckedLabel = function(resource){ 
    $scope.getResourcePromise.then(function(){ 
     for(var group in resource.groups){ 
      for(i = 0; i < resource.groups.length; i++){ 
       if (resource.groups[group].isChecked === true){ 
        return true; 
       } else { 
        return false; 
       } 
      } 
     } 
    }); 
}; 

我在做什麼:通過每個組循環,如果有一個或多個'檢查'我希望我的標籤在前端顯示檢查。當其中一人被選中,假時沒有被檢查

我的函數返回true,但它不是在視圖中顯示我的元素,因爲我得到這個錯誤在控制檯:

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting! 
Watchers fired in the last 5 iterations: [] 

和它只是一遍又一遍地開火。這裏發生了什麼?

回答

1

首要的事情是裏面的值返回異步then回調不會是isCheckedLabel返回值。

看着你的代碼,你不需要$scope.getResourcePromise.thenisCheckedLabel作爲你已經有資源對象作爲參數傳遞。也爲循環代碼似乎錯了。更改爲

$scope.isCheckedLabel = function(resource){ 
     for(var group in resource.groups){ 
      if (group.isChecked === true){ 
       return true; 
      } else { 
       return false; 
      } 
     } 
}; 
+0

謝謝@DeepakN這個解決方案工作...我以爲我已經試過這個,並得到一個未定義的錯誤,但我忘了我的$ scope.isCheckedLabel()在我的控制器的底部,並執行之前承諾解決。 – Garuuk 2014-09-18 18:01:26

+0

你的循環對我來說似乎仍然是錯誤的,它只會檢查第一個值,因爲你在第一次迭代中必須有一個'return'語句 – 2017-07-21 02:04:24

1

只有當您嘗試更新$摘要運行時的dom時纔會出現此錯誤。在您的情況下,您可以嘗試將已檢查的變量設置爲$ scope變量資源中的另一個屬性。

$scope.getResources = function() { 
    $scope.getResourcePromise = ResourceService.getResourceById($stateParams.id).then(function (response) { 
     $scope.resources = response; 
     $scope.resources.forEach(function (resource) { 
      $scope.getResourcePromise.then(function() { 
       for (var group in resource.groups) { 
        for (i = 0; i < resource.groups.length; i++) { 
         if (resource.groups[group].isChecked === true) { 
          //Here setting another property on the resource object 
          resource.checked = true; 
         } else { 
          resource.checked = false; 
         } 
        } 
       } 
      }); 
     }); 
    }); 
}; 

現在,在HTML,你可以做這樣的事情簡單:

<div ng-repeat="resource in resources"> 
    <i ng-show="resource.checked" class="fa fa-checked"> Checked </i> 
</div> 
+0

有趣的解決方案,我喜歡它。不過,我在我的應用程序的其他部分發布整個對象。我寧願避免添加屬性到我的資源對象。我是ganna嘗試使用angular.copy()來避免更改原始對象。 – Garuuk 2014-09-18 17:54:18