2015-12-22 1 views
19

Angular2でデータの配列をフィルタリングする方法を検討しています。angular2で配列をフィルタリングする

私はカスタムパイプを使用しましたが、これは私が探しているものではないと感じています。大きなデータセットをフィルタリングするのではなく、簡単なプレゼンテーション変換に適しています。次のように

配列がアウトに設定されています

getLogs(): Array<Logs> { 
     return [ 
      { id: '1', plate: 'plate1', time: 20 }, 
      { id: '1', plate: 'plate2', time: 30 }, 
      { id: '1', plate: 'plate3', time: 30 }, 
      { id: '2', plate: 'plate4', time: 30 }, 
      { id: '2', plate: 'plate5', time: 30 }, 
      { id: '2', plate: 'plate6', time: 30 } 
     ]; 
    } 

は私がidで、これをフィルタリングします。したがって、検索バーに「1」を入力すると、対応する値が表示されます。

これを行う方法がある場合、私は知りたいです!

答えて

32

デフォルトのパイプを使用していることを実行する方法はありません。私もデモを持ってhttps://github.com/thelgevold/angular-2-samples/tree/master/components/spreadsheet

はここで完全なソースです。サポートされているパイプのリストは、デフォルトでhttps://github.com/angular/angular/blob/master/modules/angular2/src/common/pipes/common_pipes.tsです。

import {Injectable, Pipe} from 'angular2/core'; 

@Pipe({ 
    name: 'myfilter' 
}) 
@Injectable() 
export class MyFilterPipe implements PipeTransform { 
    transform(items: any[], args: any[]): any { 
     return items.filter(item => item.id.indexOf(args[0]) !== -1); 
    } 
} 

そして、それを使用します:

import { MyFilterPipe } from './filter-pipe'; 
(...) 

@Component({ 
    selector: 'my-component', 
    pipes: [ MyFilterPipe ], 
    template: ` 
    <ul> 
     <li *ngFor="#element of (elements | myfilter:'123')">(...)</li> 
    </ul> 
    ` 
}) 

は ティエリー

+0

PipeTransformの実装は何をしますか?私の目的は少し混乱しています。 – Witted

+0

実際、パイプを実装する場合は、このインタフェースを実装し、 'transform'メソッドで処理する必要があります。詳細については、該当するドキュメントを参照してください:https://angular.io/docs/ts/latest/api/core/PipeTransform-interface.html。最初のパラメータはリスト自体に対応し、2番目のパラメータはリストをフィルタリングするために使用します。 –

+0

説明をありがとう。最後の質問は、* ngFor = "#element of(elements | myfilter: '123')の出力を変数にすることが可能ですか? – Witted

5

私は私のアプローチは、いくつかの予選イベントの配列を再計算することである私のサンプルの1

<input "(keyup)="navigate($event)" /> 

<div *ngFor="#row of visibleRows"></div>  

...... 

navigate($event){ 
     this.model.navigate($event.keyCode); 
     this.visibleRows = this.getVisibleRows(); 
} 

getVisibleRows(){ 
    return this.model.rows.filter((row) => row.rowIndex >= this.model.start && row.rowIndex < this.model.end); 
} 

で同様のシナリオがあります。私の場合はキーアップです。関数やフィルターにバインドすると便利かもしれませんが、代わりに配列に直接バインドすることをお勧めします。これは、変更トラッキングが発生したときに関係なく、変更トラッキングがトリガーされるたびに関数/フィルターが新しい配列インスタンスを返すため、変更トラッキングが混乱するためです。 http://www.syntaxsuccess.com/angular-2-samples/#/demo/spreadsheet

+0

は、アイブ氏は、実際にあなたのgithubのを見つけ、それはあなたのお役に立てば幸い、簡単なユースケースのためのパイプを追加することができた

非常に有用なので、ありがとう!私のテーブルは、テーブルに配列を構築するために、 を使用して、グリッドにかなり基づいています。 は、新しい、まばらに文書化された言語の大規模な助けとなっています。これは本当に質問にはあまり関連性がありませんが、もっと個人的な感謝があります。 – Witted

+0

ありがとう!サンプルを参考にしてうれしいです – TGH

+0

"変更トラッキングは、変更トラッキングがトリガーされるたびに関数/フィルターが新しい配列インスタンスを返すので混乱します" - 非常に真実ですが、毎回同じ配列インスタンスを返すことができますステートフルパイプを使用します。また、コンポーネントが許可している場合は、ステートフルパイプと組み合わせて 'onPush'変更検出戦略を使用することもできます。私は[このSOの回答](http://stackoverflow.com/a/34497504/215945)の両方のオプションについて議論します。 –

関連する問題