ngHide或ngShow基于孩子的数量

时间:2013-04-09 21:43:26

标签: angularjs

我知道这是绝对愚蠢的事,但我很好奇 有没有办法像:

<div ng-show='this.children.length > 0'> // shown
   <div>

   </div>
</div>

7 个答案:

答案 0 :(得分:62)

要添加@Josh David Miller答案,以下值将被视为角度假。

1)空数组

2)空字符串//甚至空格都被认为是真的

3)带有false

的布尔值

4)未定义

5)空

6)0

所以,大卫的回答可以写成,

<div ng-show="items.length">
  <div ng-repeat="item in items">
    <!-- ... -->
  </div>
</div>

甚至更短,

<div ng-show="items">
  <div ng-repeat="item in items">
    <!-- ... -->
  </div>
</div>

答案 1 :(得分:31)

AngularJS制作了breaking change in version 1.3.0

不幸的是,rajkamals的回答不再正确。

从这个版本开始,只有这6个值被认为是假的:

  1. false
  2. null
  3. undefined
  4. NaN
  5. 0
  6. ""
  7. 'f''0''false''no''n'[](!)变得真实。

    所以使用

    <div ng-show="items">
        <!-- ... --->
    </div>
    
    如果只有items包含至少1个元素才能显示div,则不再推荐

    ,因为即使items = []它也会显示。

答案 2 :(得分:17)

在AngularJS中,我们不应该根据我们的观点来考虑,而应该考虑我们的模型。

所以你应该问问自己在元素中生成内容的原因。如果它是动态的,它来自你的模型。那么您可以访问哪种模型属性来为您提供所需的信息?

这是一个ngRepeat示例:

<div ng-show="items.length > 0">
  <div ng-repeat="item in items">
    <!-- ... -->
  </div>
</div>

答案 3 :(得分:4)

看到你的大多数问题,看起来要么你没有以正确的方式使用Angular,要么你可能无法(因为项目限制可能!)。

一些需要考虑的一般事项。

  1. 如果您使用的是$ compile - 这是代码味道。在95%的情况下,您不需要使用$ compile。如果你使用$ compile,你就会意识到它并且你找不到任何其他方法来做你需要做的事情。你非常谨慎地使用它。

  2. 如果你“查询”DOM做任何事情 - 再一次它可能有气味。再次在95%的情况下你不需要这样做。这里正确的方法是修改模型,让Angular处理DOM。

  3. 这些应该使用与使用setTimeout 0相同的方式。每当你使用它时,它应该感觉像一个黑客。

    如果你没有完全(或至少部分)控制你的HTML(服务器可能是?),它可能会让Angular变得混乱。也许这就是为什么你试图做所有这些DOM操作的东西。

    <div ng-show='this.children.length > 0'> // shown
       <div>
    
       </div>
    </div>
    

    这是我们不确定谁控制的一个例子。如果您可以访问生成此html的构造,您也可以使用ng-init!

    编写它
    <div ng-init="childElements = {{serverside variable}}" ng-show='childElements > 0'> // shown
       <div server-side-repeat>
    
       </div>
    </div>
    

    如果你被迫在很多地方做这些事情,那么也许Angular对你来说不是正确的解决方案?

答案 4 :(得分:0)

AngularJS v1.3.3 =&gt; ng-show="items"对我不起作用,因为它评估对象true,false,null,undefined。在items=[]的情况下,ng-show仍然评估为true。相反,我不得不使用:

<div ng-show="items.length">
    <!-- ... --->
</div>

并且工作!!谢谢你的指导。

答案 5 :(得分:0)

这也很完美......

<div ng-show="items.length">
<div ng-repeat="item in items">
<!-- bind to your Dom element -->
</div>
</div>

答案 6 :(得分:0)

正如克里斯托弗指出的那样,接受的答案已不再正确。因为空数组仍然评估为真实。

obj.children = []
<div ng-show='obj.children'> 
  As of Angular 1.3 this always shows if children exists as part of obj. 
</div>

当前解决方案

在这种情况下,数组存在。但是如果你给出要计算的数组数组的零元素的角度,并且没有这样的元素,它将被评估为false。

<div ng-show='obj.children[0]'> 
  This will not show because there is no element in the array at 0
</div>

您也可以使用[n]作为数组中的任何编号元素,仅在计数大于n时显示。 如果使用obj.children [2],它只会显示数组中是否有3个或更多元素。