2017-01-23 19 views
0

私のテーブルは、私のテーブルのどのフィールドでもフィルタリングのために作成されています。検索ボックスに文字列を入力すると、コンソールに「見つかりました」が正しく表示されますが、テーブルに行は表示されません。パイプを完全に削除すると、すべて正常に動作し、テーブルにはすべてのレコードが含まれます。カスタムパイプ(フィルタ)が角2で機能しません

import { Component, Input, OnInit } from '@angular/core'; 
import { MyTableData } from '../interfaces/my-table-data.interface' 

@Component({ 
    selector: 'my-table', 
    template: ` 
    <div style="width: 100%"> 
     <div style="float: left; height: 50px; width: 100%"> 
      Search: <input type="text" [(ngModel)]="filterValue" style="height: 30px; border: 1px solid silver"/> 
     </div> 
     <div style="float: left; width: 100%"> 
      <table> 
       <tr *ngFor="let row of data.rows | myTableFilter:filterValue"> 
        <td *ngFor="let value of row">{{value}}</td> 
       </tr> 
      </table> 
     </div> 
    </div> 
    ` 
}) 
export class MyTableComponent implements OnInit { 
    @Input() data: MyTableData; 
    filterValue: string; 

    ngOnInit() { 

    } 
} 

とパイプ:

import { Component, Injectable, Pipe, PipeTransform } from '@angular/core'; 

@Pipe({ 
    name: 'myTableFilter', 
    pure: false 
}) 
@Injectable() 
export class MyTableFilterPipe implements PipeTransform { 
    transform(items: any[], arg: string): any { 
     if(arg == '') return true; 

     items.filter(item => { 
      for(let value of item) { 
       if(String(value).indexOf(arg) !== -1) { 
        console.log('found match') //it prints correctly 
        return true; 
       } 
      } 
      return false; 
     }); 
    }; 
} 

よろしく

+0

問題をよりよく理解できるようにplunkrを作成できますか? – JSNinja

+0

これはおそらく完全に適合するでしょう: https://github.com/danrevah/ngx-pipes#filterby – DanR

答えて

3

パイプ本当にフィルタパイプではなく、。これは入力を変更するために使用されます。この場合の入力は配列data.rowsであり、特定の入力引数filterValueに一致する行だけを表示したいとします。その場合は、trueまたはfalseの値ではなく、フィルタされた配列を返したいとします。一方、純粋なパイプなので、パイプを純粋に保つ必要があります。これは純粋なパイプです。入力が変更された場合のみ変更されます(filterValue):

@Pipe({ 
    name: 'myTableFilter' 
}) 
@Injectable() 
export class MyTableFilterPipe implements PipeTransform { 
    transform(items: any[], filterValue: string): any { 
     if(!items) { 
      return []; 
     } 
     if(!filterValue) { 
      return items; 
     } 
     return items.filter(item => { 
      for(let value of item) { 
       if(String(value).indexOf(filterValue) !== -1) { 
        return true; 
       } 
      }    
     }); 
    }; 
} 
+0

素晴らしい、作品!純粋なものと真のものと純粋なものとの違いについて教えてください。 –

+0

@MichalBialekパイプが偽である場合、出力が同じ入力で異なる可能性があることを意味します。たとえば、パイプ内にサービスを挿入すると、そのサービスのパラメータが変更され、パイプ出力に影響を与えます。純粋なパイプでは、入力値がfilterValueまたは配列のいずれかに変更された場合にのみ値が再評価されます – PierreDuc

+0

***(アイテムの値をとる)***の意味は何ですか? itemがオブジェクトであっても、私のvslueの値は常に未定義です – user2520306

関連する問題