来自angular forEach的有希望的响应,其中包含$ timeout

时间:2016-12-27 07:16:50

标签: angularjs foreach timeout

我有一个html按钮,必须根据范围变量启用或禁用。我根据条件为每个启用/禁用动作。对于那种情况,我需要$timeout

vm.isDisable = true;//disbles the button before forEAch
//vm.gridData, which is array  of object haves more than 1000 rows
  angular.forEach(vm.gridData,function(rows){ 
     if(rows.isSelectedRow == true) { 
        $timeout(function(){ 
            vm.gridApi.selection.selectRow(rows); 
         }) 
    });
  vm.isDisable = false; //enables the button after for each

但是因为forEach中的$timeout,所以在每次完成之前启用按钮。如何在forEach期间禁用该按钮并在迭代后重新启用它。

2 个答案:

答案 0 :(得分:0)

您应该使用all方法的承诺:

var promises = [];
vm.isDisable = true;
  angular.forEach(vm.gridData,function(rows){ 
     if(rows.isSelectedRow == true) { 

        var deferred = $q.defer();
        promises.push(deferred.promise);

        $timeout(function(){ 
            vm.gridApi.selection.selectRow(rows); 
            deferred.resolve();
         }) 
    });
$q.all(promises).then(function(){
    vm.isDiable = false;
});

答案 1 :(得分:0)

$timeout返回一个承诺,这样你就可以创建一个这些承诺的数组,并在它们全部解析后启用按钮

var promises = vm.gridData.reduce(function(a, c) {
  if (c.rows.isSelectedRow == true) {
    a.push($timeout(function() {
      return vm.gridApi.selection.selectRow(c.rows);
    }));
  }
  return a;
}, []);


$q.all(promises).then(function(){
    vm.isDiable = false;
})