【问题标题】:Angular 5 show "No data found" on ngIf empty resultsAngular 5 在 ngIf 空结果上显示“未找到数据”
【发布时间】:2018-07-23 21:33:26
【问题描述】:

我正在使用 Angular 5,我正在构建一个项目列表,其中包含一些过滤列表的按钮。当其中一个过滤器隐藏列表中的每个项目时,我正在努力做的是显示“未找到数据”类型的消息。

基本上是这样的:

过滤器按钮

<div padding>
    <ion-segment [(ngModel)]="filter" (ionChange)="onFilterChange()">
        <ion-segment-button value="all">
            All
        </ion-segment-button>
        <ion-segment-button value="2">
            Pending
        </ion-segment-button>
        <ion-segment-button value="1">
            Confirmed
        </ion-segment-button>
    </ion-segment>
</div>

列表

<ion-list *ngFor="let r of (reservations | async)">
    <ion-card *ngIf="(filter == 'all' || filter == r.confirmed)">
        <ion-item>
            Item
        </ion-item>
    </ion-card>    
</ion-list>

注意:我使用的是异步管道,因为数据来自 Firebase 实时数据库。

所以,我所有的项目都处于待处理状态(已确认:2),所以当我点击“已确认”按钮时,列表中的所有项目都被隐藏了,这是完美的。但是如何显示“未找到数据”消息而不是空列表?

我尝试了 else 条件,但收到多条“未找到数据”消息(每个隐藏项目一条):

<ion-list *ngFor="let r of (reservations | async)">
    <ion-card *ngIf="(filter == 'all' || filter == r.confirmed); else empty;">
        <ion-item>
            Item
        </ion-item>
    </ion-card>    
</ion-list>
<ng-template #empty>
    No data found...
</ng-template>

那么实现这一目标的正确方法是什么? 谢谢。

【问题讨论】:

  • &lt;ion-card *ngIf="filter != 'all' &amp;&amp; filter != r.confirmed"&gt; &lt;ion-item&gt; No Data &lt;/ion-item&gt; &lt;/ion-card&gt;
  • 尝试在离子列表中移动
  • @mast3rd3mon 这样它给了我重复的“无数据”,每个隐藏的列表项一个......
  • @BorisLobanov 是的,我试过了,但结果是一样的......
  • 这不是else 的好用例。只需使用&lt;div *ngIf ="(reservations | async).filter(f)"&gt;None&lt;/div&gt;

标签: javascript angular angular-ng-if


【解决方案1】:

试试这个方法,告诉我它是否适合你。

组件:

// control variable
  dataAvailable = false;

  onFilterChange(filterType: number) {
    // your code and logic

    // This is pretty ugly, make it prettier please...    

    // checking if exists at least 1 reservation with confirmed = 1 | 2 (depends on argument).
    this.dataAvailable = this.reservations.filter(res => res.confirmed === filterType).length > 0;
  }

模板:

<div *ngIf="dataAvailable; then printData else empty"></div>

<ng-template #printData>
  <ion-list *ngFor="let r of (reservations | async)">
      <ion-card>
          <ion-item>
              Item
          </ion-item>
      </ion-card>    
  </ion-list>
</ng-template>
<ng-template #empty>
    No data found...
</ng-template>

所以,我的想法是首先我们检查是否值得遍历模板中的数据。我们在组件中检查它,看看它是否存在任何带有过滤值的保留。

如果它不存在,我们不会循环,我们只是显示(无数据)。 如果它确实存在,我们将循环并打印它们......

这有意义吗?希望它可以帮助您或至少为您指明正确的方向!

【讨论】:

  • 谢谢,我想这可行,但决定使用@Jota.Toledo,因为一个非常大的列表可以用他的代码更好地执行
【解决方案2】:

IMO 您不应该显示原始预订列表。而是显示已过滤的列表:

component.html

<ion-segment [formControl]="status" (ionChange)="onFilterChange()">
    <ion-segment-button value="2">
        Pending
    </ion-segment-button>
    <ion-segment-button value="1">
        Confirmed
    </ion-segment-button>
</ion>

<div *ngIf="empty$ | async; else notEmpty">
   Nothing
</div>
<ng-template #notEmpty>
   <ion-list *ngFor="let reservation of reservations$ | async">
        <ion-card>
            <ion-item>
                Item
            </ion-item>
        </ion-card>    
    </ion-list>
</ng-template>

组件.ts

import {combineLatest} from 'rxjs/observable/combineLatest';
import {FormControl} from '@angular/forms';

status= new FormControl;
reservations$: Observable<IReservation[]>;
empty$: Observable<boolean>;

constructor(){
   this.reservations$ = combineLatest(rawReservations$,this.status.valueChanges,this._applyFilter);
  this.empty$ = this.reservations$.map(reservations => reservations.length === 0);
}

private _applyFilter(reservations: IReservation[], status: number): IReservation[]{
  let result = reservations;
  //apply filter logic
  return result;
}

【讨论】:

  • 这似乎是一个聪明的方法。我会尝试转换您的代码(我使用的是 Angularfire2 和 Firebase),看看它是否有效。
  • 这确实可以通过使用一些更高级的技术(表示组件+嵌入)进一步改进;您可以删除空 $ 和 ng-if-else。如果您对此感兴趣,请告诉我,以便我更新答案。
  • 通过这样做避免多个订阅:*ngIf="(reservations$ | async) as reservations; else notEmpty" 然后*ngFor="let reservation of reservations"(没有第二个异步管道)
猜你喜欢
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2019-02-13
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多