2017-05-06 57 views
0

我正在使用管道过滤数据表中的三个不同列上的数据。 该列的名称是category,name,department管角2过滤多列考虑空值

我传递的参数如下所示:

<table class="table table-striped" [mfData]="listdata | dataFilter : filtername : filterDep : filterCategory"> 

我有*ngFor循环:

<tr *ngFor="let item of mf.data; let i =index"> 
    <td> 
     {{i+1}} 
    </td> 
    <td>{{ item.name }}</td> 
    <td>{{item.department}}</td> 
    <td>{{item.category}}</td> 

</tr> 

其设置查询变量的代码是

<th colspan="2"> 
    Filter by name: 
    <input class="form-control" [(ngModel)]="filtername" (input)="change()" /> 
</th> 
<th colspan="1"> 
    Filter by Department: 
    <input class="form-control" [(ngModel)]="filterDep" (input)="change()" /> 
</th> 
<th colspan="1"> 
    Filter by Category: 
    <input class="form-control" [(ngModel)]="filterCategory" (input)="change()" /> 
</th> 

我在有数据其中一些categorynull

,我现在用的管道是:如果

@Pipe({ 
    name: "dataFilter" 
}) 
export class DataFilterPipe implements PipeTransform { 

    transform(array: any[], query: string, query2: string, query3: string): any { 

     let notNullCategory = _.reject(array, ['category', null]); 

     if (query || query2 || query3) { 

      return _.filter(notNullCategory, row => ((row.name.indexOf(query) > -1) && (row.department.indexOf(query2) > -1) && (row.category.indexOf(query3) > -1))); 

     } 
     return array; 
    } 
} 

这样,使用者与具有的category非空值被认为是一些name只有行的搜索。

我想考虑具有空值的行,但我无法这样做。

如果我改变我管:

@Pipe({ 
    name: "dataFilter" 
}) 
export class DataFilterPipe implements PipeTransform { 

    transform(array: any[], query: string, query2: string, query3: string): any { 
     if (query || query2 || query3) { 

      return _.filter(array, row => ((row.name.indexOf(query) > -1) && (row.department.indexOf(query2) > -1) && (row.category.indexOf(query3) > -1))); 

     } 
     return array; 
    } 
} 

我得到的错误:

Cannot read property 'indexOf' of null 

任何帮助将不胜感激。

+0

它看起来像查询变量没有被设置 – LiverpoolOwen

+0

你的代码在哪里设置这个变量 – LiverpoolOwen

+0

@LiverpoolOwen我有三个文本框设置查询变量。我将编辑我的问题。 – mistletoe

回答

0

你需要检查,如果每个row的名字,部门或catigory为null:

@Pipe({ 
    name: "dataFilter" 
}) 
export class DataFilterPipe implements PipeTransform { 

    transform(array: any[], query: string,query2: string,query3: string): any { 

     if(query || query2 || query3) 
     { 

      return _.filter(array, row => 
      { 
       var hasName =  row.name && row.name.indexOf(query) > -1; 
       var hasDepartment = row.department && row.department.indexOf(query2) > -1 
       var hasCategory = row.category && row.category.indexOf(query3) > -1 
       return hasName && hasDepartment && hasCategory; 
      }); 
     } 
     return array; 
    } 
} 
+0

非常感谢!我试过这个,但它仍然没有给出搜索结果,其中也包括具有空值作为类别的结果。 (当用户只搜索名称时)。 – mistletoe

+0

我认为我迷失在你所问的问题上,你能发表一个样本数组和示例查询以及你正在寻找的各自期望的输出吗?这会帮助我更好地理解。 –

0

如果要筛选分类,只有当类别不为空,你可以这样做:

@Pipe({ 
    name: "dataFilter" 
}) 
export class DataFilterPipe implements PipeTransform { 
    transform(array: any[], name: string, department: string, category: string): any { 

     if (name || department || category) { 
      _.filter(array, row => ((row.name.indexOf(name) > -1) 
       && (row.department.indexOf(department) > -1) 
       && (row.category ? row.category.indexOf(category) > -1 : true)) 
      ); 
     } 
     return array; 
    } 
} 
+0

@mistletoe,我的解决方案适合你吗? –