AngularJS ng-repeat处理空列表案例

Pri*_*orn 377 javascript angularjs angularjs-ng-repeat angularjs-ng-show

我认为这将是一个非常普遍的事情,但我找不到如何在AngularJS中处理它.假设我有一个事件列表并希望使用AngularJS输出它们,那么这很简单:

<ul>
    <li ng-repeat="event in events">{{event.title}}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

但是当列表为空时我该如何处理?我希望有一个消息框,其中列表中包含"无事件"或类似内容.唯一可以接近的是ng-switchwith events.length(如果对象而不是数组,我如何检查是否为空?),但这真的是我唯一的选择吗?

Art*_*eev 567

你可以使用ngShow.

<li ng-show="!events.length">No events</li>
Run Code Online (Sandbox Code Playgroud)

例子.

或者你可以使用ngHide

<li ng-hide="events.length">No events</li>
Run Code Online (Sandbox Code Playgroud)

例子.

对于对象,您可以测试Object.keys.

  • nh-show工作了我的情况,但它没有更新状态,当我把过滤器,没有任何返回.此外,对象在第一次加载时出现,并在页面加载完成重复过程时消失. (5认同)

Kon*_*ski 367

如果你想在过滤列表中使用它,这是一个巧妙的技巧:

<ul>
    <li ng-repeat="item in filteredItems  = (items | filter:keyword)">
        ...
    </li>
</ul>
<div ng-hide="filteredItems.length">No items found</div>
Run Code Online (Sandbox Code Playgroud)

  • 是!忍者加分!这样可以节省两次评估复杂滤波器的角度! (17认同)
  • @MKSafi,它在作用域上创建了一个名为`filteredItems`的新变量,并将其值设置为``(items | filter:keyword)` - 换句话说,过滤器返回的数组 (7认同)
  • 很有用.错字虽然有"filteredFragments". (3认同)
  • 此外,对于多个过滤器,似乎存在一些局限性,例如`"faceFils = faces:filter:{deleted:true} | orderBy:'text'`但我同意所有人,这是一个神话般的技巧. (2认同)

Mor*_*mer 29

如果您只想在列表为空时从DOM中删除,则可能需要检查angular-ui指令 :ui-iful

<ul ui-if="!!events.length">
    <li ng-repeat="event in events">{{event.title}}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

  • 最新的角度包括`ng-if`! (21认同)
  • 请注意,`ng-if`正在创建一个新范围,其中`ng-hide`不是.这可能会导致意外行为. (4认同)

Pyl*_*nux 29

使用更新版本的angularjs,这个问题的正确答案是使用ng-if:

<ul>
  <li ng-if="list.length === 0">( No items in this list yet! )</li>
  <li ng-repeat="item in list">{{ item }}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

当列表即将下载时,此解决方案不会闪烁,因为必须定义列表并且长度为0才能显示消息.

这是一个使用它的插图:http://plnkr.co/edit/in7ha1wTlpuVgamiOblS?p = preview

提示:您还可以显示加载文本或微调器:

  <li ng-if="!list">( Loading... )</li>
Run Code Online (Sandbox Code Playgroud)


Ber*_*ard 23

<ul>
    <li ng-repeat="item in items | filter:keyword as filteredItems">
        ...
    </li>
    <li ng-if="filteredItems.length===0">
        No items found
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

这类似于@Konrad'ktoso'Malawski,但稍微容易记住.

使用Angular 1.4进行测试

  • 你的意思是`ng-if ='!filteredItems.length'` (3认同)

Mir*_*zer 6

这是使用CSS而不是JavaScript/AngularJS的不同方法.

CSS:

.emptymsg {
  display: list-item;
}

li + .emptymsg {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)

标记:

<ul>
    <li ng-repeat="item in filteredItems"> ... </li>
    <li class="emptymsg">No items found</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

如果列表为空,<li ng-repeat ="filterItems中的项目">等将被注释掉,并将成为注释而不是li元素.