【问题标题】:Filter table in AngularAngular中的过滤表
【发布时间】:2019-05-07 14:59:48
【问题描述】:

我有一个包含两个过滤选项“性别”和“国家”的表格!本质上,过滤器有效,即我单击男性或女性的性别下拉列表,表格显示了所有条目。我的问题是,按照我所做的方式,我总是必须刷新(如重新加载数据)表,然后才能再次过滤。假设我有女性过滤器,我不能直接点击男性来显示男性条目,我必须刷新然后我才能再次过滤。我确信这只是一两行代码的问题,但我似乎无法弄清楚。

下面是我的方法:

filterByGender(event) {
    let gender = event;
    if (gender === "Male") {
      gender = "M";
    } else if (gender === "Female") {
      gender = "F";
    }
    let filteredGender = this.customerArray
      .filter(customer => customer.gender === gender);
    console.log("filteredGender", filteredGender);
    this.customerArray = filteredGender;

  }

  filterByCountry(event) {
    let country = event;
    let filteredCountry = this.customerArray
      .filter(customer => customer.countryCode === country);
    this.customerArray = filteredCountry;
  }

this.customerArray 是后端所有客户的数组。现在它不能按我想要的方式工作的原因是因为我重新填充了数组,所以我不能做第二个过滤器,但是有什么办法解决这个问题?

【问题讨论】:

    标签: angular filter


    【解决方案1】:
     transform(items: Incident[], location_id: string, driver_id: string,
        description: string, type: string,technician_id: string){
        if (items && items.length){
            return items.filter(item =>{
                if (location_id && item.location_id.name.toLowerCase().indexOf(location_id.toLowerCase()) === -1){
                    return false;
                }
                if (driver_id && item.driver_id.name.toLowerCase().indexOf(driver_id.toLowerCase()) === -1){
                    return false;
                }
                if (description && item.description.toLowerCase().indexOf(description.toLowerCase()) === -1){
                  return false;
                }
                if (type && item.incidenttype_id.name.toLowerCase().indexOf(type.toLowerCase()) === -1){
                  return false;
                }
                if (technician_id && item.technician_id.name.toLowerCase().indexOf(technician_id.toLowerCase()) === -1){
                    return false;
                }
    
                return true;
           })
        }
        else{
            return items;
        }
    }
    
        enter code here
    

    【讨论】:

      【解决方案2】:

      如果您想根据选择框上的选定值过滤表格,您实际上可以使用 Angular Pipe

      根据您的喜好创建 2 Stackblitz Demo

      Single Filter Pipe for Table List - 仅按性别过滤

      Multiple Selection Filter Pipe for Table List - 按性别和国家/地区过滤

      TableFilterPipe

      在您的模块声明

      上导入 TableFilterPipe
      @Pipe({
         name: 'tableFilter'
      })
      export class TableFilterPipe implements PipeTransform {
      
         transform(list: any[], value: string) {
      
            // If there's a value passed (male or female) it will filter the list otherwise it will return the original unfiltered list. 
            return value ? list.filter(item => item.gender === value) : list;
      
         }
      }
      

      自定义组件

      @Component({
         ...,
         template: `
            <select [(ngModel)]="gender">
               <option value="male">Male</option>
               <option value="female">Male</option>
            </select>
      
            <table>
                ...
                <tr *ngFor="let user of users | tableFilter: gender">   // Use your pipe here, so whenever there's a change on selectbox, it will filter the list based on the value assigned. 
                    <td>{{ user.name }}</td>
                    <td>{{ user.gender }}</td>
                </tr>
            </table>
      
         `
      })
      export class CustomComponent {
         gender: string;
      
         users: any[] = [...];
      
      }
      

      【讨论】:

      • 如何向管道添加另一个参数?假设我有第二个国家/地区下拉列表,如何将其添加到表格过滤器中?
      • @kontenurban 鉴于您的关注,已经创建了另一个 Stackblitz。希望它有所帮助:) stackblitz.com/edit/ngx-table-multi-select-pipe
      • 这就是我遇到的这个问题,过滤器只通过剩余的东西,而不是过滤整个数组。换句话说,假设我首先过滤女性(显示所有女性),然后我过滤韩国(显示韩国的条目),但现在如果我想做另一个过滤器,例如显示所有男性,它不起作用,因为数组中没有更多项目,所以表返回空。
      • @kontenurban 更新了最新的 stackblitz 链接。我认为您正在寻找的是每当用户选择性别(根据性别值过滤列表)时,国家/地区值必须为空。选择国家/地区后,过滤器现在将是性别:女性和国家/地区:例如韩国,每当您想再次选择性别时,必须重置列表并使用当前性别值进行过滤,反之亦然。
      • 很好的答案和演示,对我帮助很大,谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2020-07-08
      • 2015-10-20
      相关资源
      最近更新 更多