【问题标题】:Angular - How to display single "no results" message on no resultsAngular - 如何在没有结果时显示单个“无结果”消息
【发布时间】:2021-05-18 20:32:11
【问题描述】:

我无法想出一种方法来显示我的“无结果”div 元素。基本上,我有一个包含订单时间线部分组件的列表组件,每个部分都包含订单组件。像这样:

我的 orders-list.component.html(检查底部 div):

<div class="list-container" [ngClass]="{section: isDeliverySlotsActive === false}">
    <label class="list-header" *ngIf="isDeliverySlotsActive === true" style="margin-top: 1.625rem">DELIVERY SLOTS ORDERS</label>
    <div [ngClass]="{section: isDeliverySlotsActive === true}" *ngFor="let date of timelines">
        <app-orders-list-section
            [orders]="orders"
            [timeline]="date"
            [isDeliverySlotsActive]="isDeliverySlotsActive"
            [searchTerm]="searchTerm"
        ></app-orders-list-section>
    </div>
</div>
/* I want to show the below div when there are no results for the search */
<div id="no-results">
    <img src="../../../assets/my-orders/no-results.png" alt="No Results" style="margin-top: 6.063rem; margin-bottom: 2.837rem;">
    <label class="no-results-text">COULDN'T FIND ANYTHING</label>
    <label class="no-results-text weight-medium">Search by order number or customer</label>
</div>

对于每个部分,当用户使用搜索栏搜索订单时,都会应用一种过滤方法。如果搜索词与部分中的订单不对应,则不会显示该部分的订单。如果该部分没有结果,则也不会显示部分标题。

我的orders-list-section.component.html

<div *ngIf="filteredSectionOrders.length > 0">
    <label
        *ngIf="isDeliverySlotsActive === true"
        [ngClass]="{ slots: isDeliverySlotsActive === true }">
    {{ timeline | addSectionDateFormat }}
    </label>
</div>
<div *ngFor="let order of filteredSectionOrders">
    <app-orders-list-item
        [order]="order"
        [timeline]="timeline"
    ></app-orders-list-item>
</div>

我在section组件中的过滤方法:

filterSectionOrders(searchString: string){
    if(!searchString) return;
    if(this.hasNumbers(searchString)){
        this.filteredSectionOrders = this.filteredSectionOrders.filter(order => order.order_num.toString().indexOf(searchString) !== -1);
    }
    else{
        this.filteredSectionOrders = this.filteredSectionOrders.filter(order => {
            if(order.first_name && order.last_name){
                let fullName = order.first_name + " " + order.last_name;
                if(fullName.toLowerCase().indexOf(searchString.toLowerCase()) !== -1){
                    return order;
                }
            }
        })
    }
}

鉴于我将此过滤器应用于每个部分而不是整个列表,我如何找出总结果为 0 的时间,以便我可以只显示一个(不是每个部分) 带有“未找到结果”消息的 div 元素?

提前谢谢你。

【问题讨论】:

  • 如果您在返回 JSX 之前在父组件中运行过滤代码,这将容易得多。您可以将每个部分放入一个有序数组中,并让每个数组都包含一个带有订单的子数组。最好在 React.useMemo() 函数中执行此操作以提高性能。
  • @Aadmaa 虽然这不是 React,但将过滤逻辑上移到父组件的方法仍然是正确的。如果您愿意,可以发布相应更新的答案,我会将其标记为正确答案。谢谢!
  • 更正:您可以在父组件中运行过滤代码。您可以将每个部分放入一个有序数组中,并让每个数组都包含一个带有订单的子数组。如果可能的话,最好记住这一点以提高性能。

标签: html angular typescript


【解决方案1】:

您可以轻松地在 HTML 中从角度使用 *ngIf;else link to ngIf

我不确定你在哪里使用filteredSectionOrders,因为它没有显示在你的html中,但我们假设你的app-orders-list-section有一些HTML逻辑,你使用*ngFor循环订单并正确显示它

所以,我猜你的代码看起来像这样

<div class="order" *ngFor="let order of filteredSectionOrders">
  <img/>
  <p>
    {{ order.first_name + ' ' + order.last_name }}
  </p>
</div>

这是我认为的简化的 html。

接下来你能做什么:

<ng-template *ngIf="filteredSectionOrders.length > 0; else noResultsBlock">
  // here you insert your code to render orders
  <div class="order" *ngFor="let order of filteredSectionOrders">
    <img/>
    <p>
      {{ order.first_name + ' ' + order.last_name }}
    </p>
  </div>
</ng-template>
<ng-template #noResultsBlock>
  <p> No results </p>
</ng-template>

所以,这将是简单的解决方案 如果您想进一步改进它,最好有一个新变量,比如说areThereResults,您将在方法filterSectionOrders 的末尾将其设置为truefalse,基于filterSectionOrders.length。然后,您将在 *ngIf 检查中使用这个新变量,而不是 filterSectionOrders.length &gt; 0

使用boolean 变量而不是使用实际数组的原因是检测更改,并且将在*ngIf 中重新渲染UI。您可以在 Angular 文档中阅读更多相关信息,只需搜索检测更改即可。

【讨论】:

  • 感谢您的回复!我还没有尝试过你的代码,但从我所看到的来看,当它不包含搜索词的订单时,你的解决方案会在每个部分中显示“无结果”消息,对吗?问题是,我应该更清楚,我只想显示 一个“无结果”消息(请参阅列表组件 .html 中的底部 div),而不是每个部分一个。另外,我更新了我的问题。
  • 我通过将过滤逻辑移动到父列表组件来解决它。这样,我可以为这些部分发送一个过滤的订单数组,如果这个数组为空,我会显示“无结果”提示。再次感谢您的回答,它帮助我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多