2014-09-18 42 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