【问题标题】:Angular 6 how to check if my pipe filter returns an empty arrayAngular 6如何检查我的管道过滤器是否返回一个空数组
【发布时间】:2020-06-10 13:49:07
【问题描述】:

我有一个恐龙列表,我遍历它,然后我添加了一个搜索输入以通过登录属性过滤列表,如下所示

<input type="text" class="recherche" [(ngModel)]="loginToSearch" placeholder="Entrez votre recherche ici...">

    <li *ngFor="let dinosaure of dinosauresList | filter: login : loginToSearch" class="list-group-item text-left">
      <div>
        <img class="img-thumbnail" src="{{ dinosaure.profileImage}}">
        <label class="name">
          {{dinosaure.login}}<br>
        </label>
      </div>
      <div class="btn-plus">
        <label class="pull-right">
          <a class="btn btn-success btn-xs glyphicon glyphicon-plus" 
                 (click)="onClickAddFriend(dinosaure)"
            title="View"></a>
        </label>
      </div>

    </li>

但我想添加一个条件以在过滤器没有返回结果时显示消息或表单,我尝试了许多我找到的解决方案,但没有一个对我有用。

这是我的过滤器:

   @Pipe({
     name: 'filter'
  })
export class FilterPipe implements PipeTransform {

      transform(value: any, args: any, loginToSearch: string): any {
        if (!value) {

         return null;
         }
      if (!args && !loginToSearch) {
              return value;
             }
         loginToSearch = loginToSearch.toString().toLowerCase();
             return value.filter(data => {
           return data.login.includes(loginToSearch);
                 });

                }

             }

【问题讨论】:

  • 你为什么不把你的
  • 包裹在一个 *ngIf 中?
  • @BELLIL 我没有找到合适的条件放入 *ngIf 这就是原因
  • 出于性能原因,您应该使用过滤器或排序管道。官方 Angular 文档建议避免使用它。
  • 标签: angular pipe ngfor


    【解决方案1】:

    我会建议你改变工作方式,

    您可以在(ngModelChange) 上添加一个 ng 到您的前面

    所以你的输入会是这样的

    <input type="text" class="recherche" [(ngModel)]="loginToSearch" placeholder="Entrez votre recherche ici..."  (ngModelChange)="onFilterValueChange()" >
    

    然后在您的组件中声明一个临时列表并搜索您的值

    temporaryList = [];
    onFilterValueChange(){
            if(this.loginToSearch){
             this.temporaryList = this.dinosauresList.filter(data => data.login.includes(this.loginToSearch));} 
             else {  this.temporaryList  = this.dinosauresList;
            }}
    

    然后在你的html中你可以做

    <div *ngIf="temporaryList  === 0;else results"> Your error message  </div>
    
    <ng-template #results>
        <li *ngFor="let dinosaure of temporaryList " class="list-group-item text-left">
          <div>
            <img class="img-thumbnail" src="{{ dinosaure.profileImage}}">
            <label class="name">
              {{dinosaure.login}}<br>
            </label>
          </div>
          <div class="btn-plus">
            <label class="pull-right">
              <a class="btn btn-success btn-xs glyphicon glyphicon-plus" 
                     (click)="onClickAddFriend(dinosaure)"
                title="View"></a>
            </label>
          </div>
    
        </li>
    
    </ng-template>
    

    如果你坚持使用你的管道,你必须创建一个 service,其中包含一个 event emitter,当你的列表为空时通知你的组件,如果你创建一个 stackblitz,我将能够给你更多帮助

    【讨论】:

    • 我和你的想法一样!
    • 但我认为当我从输入中删除时仍然存在问题,它不会恢复数组
    • 我也尝试查找一个元素并找到了它,但是当我删除并查找另一个现有元素时它不会工作它会显示错误消息,因为输入为空
    • 抱歉,我从未使用过 stackblitz,但如果你只想要前端部分,我可以给你一个 github 存储库
    • 你能看看我修改过的代码吗?我在 onFilterValueChange() 中添加了一个条件,如果 loginToSearch 为空,您应该重新初始化
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签