如何检查可观察数组的长度


109

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

list$: Observable<any[]>;

在我的模板中

<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>

但是list $ .length在Observable数组中不起作用。

更新:

似乎(list $ | 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>

谁能指导我如何检查可观察数组的长度。


Answers:


178

您可以使用| async管道:

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

更新-Angular版本6:

如果要加载CSS骨架,则可以使用它。如果数组没有项目,它将显示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>

4
我也尝试过,但是它给出了错误“ TypeError:无法读取null的属性'length'”
Naveed Ahmed

3
从您提供的信息中很难得知。尝试<div *ngIf="(list$ | async)?.length==0">No records found.</div>(加?
君特Zöchbauer

6
我尝试过此方法,它有效<div * ngIf =“(list $ | async)?. length == 0”>未找到任何记录。</ div>
Naveed Ahmed

3
附加项?是必需的,因为list$ Angular2尝试首次渲染视图后才设置。?阻止评估子表达式的其余部分,直到剩下的子表达式?变为!= null(Elvis或安全导航操作符)为止。
君特Zöchbauer

1
@GünterZöchbauer在我看来,第一个async管道可以解析数据,因此我的下一个async循环管道不会显示任何内容。或*ngIf创建其他作用域,因此无法正常工作。很难说。但是,虽然我的循环包含在if中,但它不显示任何数据。如果自身评估true正确。
尤金(Eugene)

31

.ts文件的解决方案:

     this.list.subscribe(result => {console.log(result.length)});

之后是否有必要立即退订?
彼得

最好取消订阅onDestroy组件的可观察对象
ThPadelis '19

16

对于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>

7

虽然这个答案是正确的

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

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



2

这里的方法还有一个主要问题:通过反复使用模板中的异步管道,实际上可以启动单个Observable的许多订阅。

KAMRUL HASAN SHAHED在上面具有正确的方法:使用异步管道一次,然后为可在子节点中利用的结果提供别名。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.