2017-05-16 46 views
0

我试图仅在用户首先至少选择了一个复选框时才显示div元素。知道对象是否为空Angularjs

<div class="col-md-1" ng-if="selectedElements.length > 0">     

selectedElements声明在我的控制器是这样的:我是在div尝试这种

$scope.selectedElements = []; 

工作的第一次,但是当我选择一个复选框,然后我取消选择的div没有按不会消失。

复选框声明如下:

<input type="checkbox" ng-model="selectedElements[node.real_id]"> 

的复选框是NG-repeat语句里面,这就是原因,在NG-模型的指数。

+0

是'node.real_id'多少? –

+0

是的,它来自数据库ID –

回答

2

ng-model设置为将在指定索引处向该数组添加一个布尔值,然后在取消选中时将其设置为false。因此,它仍然会存在,并且length> 0 ...

可以说你想要什么其实是检查是否有数组中是真实的任何项目。如果是这样的话,你可以使用:

<div class="col-md-1" ng-if="selectedElements.some((el) => el)"> 

some需要一个函数,并返回true,如果函数曾经返回true。我使用了ECMAScript 2015语法。如果您使用的是较旧的浏览器:

<div class="col-md-1" ng-if="selectedElements.some(function (el) { return el; })"> 

你可能需要做一个函数在你的控制器对于这一点,但是这是想法。

1

它首次运行,因为ng-model="selectedElements[node.real_id]"正在将一个值推入selectedElements索引node.read_ud。因此,selectedElements.length > 1在选中复选框时为true,但在取消选中时也为true,并且selectedElements[node.real_id]为false,因为该元素仍在数组中。

我想你想要的东西,如:

<div class="col-md-1" ng-if="selectedCount"> 

<input type="checkbox" ng-model="selectedElements[node.real_id]" ng-change="onSelect(node.real_id)"> 

而在你的控制器:

$scope.selectedCount = 0; 

$scope.onSelect = function(id) { 
    if ($scope.selectedElements[id]) { 
     $scope.selectedCount++; 
    } else { 
     $scope.selectedCount--; 
    } 
} 

此外,selectedElements可以替代(用像一本字典)的对象。

+0

我不确定ng模型是否有必要,不同的方法,但很好的解决方案,谢谢。 –

+0

不客气。这样做的好处在于,您不是遍历每个摘要循环的数组,以确定是否检查了任何循环。 –

0

我在控制器中创建一个函数,像这样使用:

<div class="col-md-1" ng-show="empty(selectedElements)"> 

和Controller如下:

$scope.empty = function(data){ 
    var empty = false; 
    angular.forEach(data, function(element, key){ 
     if(element == true) 
      empty = true; 
    }); 
    return empty; 
} 
+0

如果您使用常规的'for'循环,只要找到第一个'true',而不是继续循环,就可以立即返回。 @Mike McCaughan的解决方案使用'some'来做到这一点。 –

+0

你是完全正确的。我没有考虑表现。 –