如何检查Observable数组的长度

Nav*_*med 89 observable angular2-template angular2-services angular

在我的Angular 2组件中,我有一个Observable数组

list$: Observable<any[]>;
Run Code Online (Sandbox Code Playgroud)

在我的模板中我有

<div *ngIf="list$.length==0">No records found.</div>

<div *ngIf="list$.length>0">
    <ul>
        <li *ngFor="let item of list$ | async">item.name</li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

但是对于Observable数组,列表$ .length不起作用.

更新:

似乎(列出$ | async)?. length给出了我们的长度但是下面的代码仍然不起作用:

<div>
    Length: {{(list$ | async)?.length}}
    <div *ngIf="(list$ | async)?.length>0">
        <ul>
            <li *ngFor="let item of (list$ | async)">
                {{item.firstName}}
            </li>
        </ul>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

任何人都可以指导我如何检查Observable数组的长度.

Gün*_*uer 147

你可以使用| async管道:

<div *ngIf="(list$ | async)?.length==0">No records found.</div>
Run Code Online (Sandbox Code Playgroud)

更新 - Angular版本6:

如果你正在加载一个CSS Skeleton,你可以使用它.如果数组没有项目,它将显示css模板.如果有数据则填写ngFor.

<ul *ngIf="(list$| async)?.length > 0; else loading">
   <li *ngFor="let listItem of list$| async">
      {{ listItem.text }}
   </li>
</ul>

<ng-template #loading>
  <p>Shows when no data, waiting for Api</p>
  <loading-component></loading-component>
</ng-template>
Run Code Online (Sandbox Code Playgroud)

  • 我试过这个,它的工作原理是<div*ngIf ="(list $ | async)?. length == 0">没有找到记录.</ div> (5认同)
  • 我也试过了,但它给出了错误"TypeError:无法读取属性'长度'的null" (4认同)
  • 附加的`?`是必需的,因为`list $`仅在*Angular2尝试第一次渲染视图后设置*.`?`防止对子表达式的其余部分进行求值,直到`?`的左边部分变成`!= null`(Elvis或安全导航操作符). (3认同)
  • @GünterZöchbauer - 在上面的代码中,您使用异步管道订阅同一资源两次 - 最好使用 `as` 语法: `&lt;ul *ngIf="(list$| async as list)?.length &gt; 0; else loading"&gt; &lt;li *ngFor="let listItem of list"&gt; {{ listItem.text }} &lt;/li&gt; &lt;/ul&gt;` 将订阅存储在模板变量 `list` 中(注意没有美元符号)和然后在模板中使用这个 - 从而避免多次订阅。 (3认同)
  • 很难从您提供的信息中了解到.试试`<div*ngIf ="(列表$ | async)?. length == 0">找不到记录.</ div>`(添加`?`) (2认同)
  • 这不会创建 2 个订阅吗?你可以包装它 `&lt;ng-container *ngIf="list$ | async as list"&gt;` 然后 `&lt;ul *ngIf="list.length &gt; 0; else loading"&gt;` (2认同)

Bla*_*ank 28

.ts-Files的解决方案:

     this.list.subscribe(result => {console.log(result.length)});
Run Code Online (Sandbox Code Playgroud)


KAM*_*HED 12

对于Angular 4+,试试这个

<div *ngIf="list$ | async;let list">
    Length: {{list.length}}
    <div *ngIf="list.length>0">
        <ul>
            <li *ngFor="let item of list">
                {{item.firstName}}
            </li>
        </ul>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)


And*_*vic 6

虽然这个答案是正确的

<div *ngIf="(list$ | async)?.length === 0">No records found.</div>
Run Code Online (Sandbox Code Playgroud)

请记住,如果您使用http客户端来调用后端(在大多数情况下是这样做),则如果列表中有多个列表,则会重复调用API 异步。这是因为每个| 异步管道将在您的$$可观察列表中创建新的订户。