* ngForにフィルターを適用する方法は?


278

どうやら、Angular 2はng-forと組み合わせてAngular1のようにフィルターの代わりにパイプを使用して結果をフィルター処理しますが、実装はあいまいで、明確なドキュメントはありません。

つまり、私が達成しようとしていることは、次の視点から見ることができます

<div *ng-for="#item of itemsList" *ng-if="conditon(item)"></div>

パイプを使用してそのように実装する方法は?


8
ハッシュシンボルに関するngForの重大な変更がベータ17で導入されていることに注意してください。正しい方法は次のとおりです。<div *ngFor="let item of itemsList" *ngIf="conditon(item)" ...
Memetオルセン


11
以下ギュンターから@MemetOlsenコメント:「*ngFor*ngIf同じ要素でサポートされていません。あなたがそれらのいずれかの明示的な形式に変更する必要があります。」
赤エンドウ豆

1
それがOPが要求するものであっても、Angular2 +でのフィルタリングや順序付けにはPIPEを使用しないことをお勧めします。フィルターされた値を持つクラスプロパティを持つことを推奨し
ylerjen

回答:


395

基本的には、*ngForディレクティブで使用できるパイプを記述します。

あなたのコンポーネントで:

filterargs = {title: 'hello'};
items = [{title: 'hello world'}, {title: 'hello kitty'}, {title: 'foo bar'}];

テンプレートでは、文字列、数値、またはオブジェクトをパイプに渡して、フィルタリングに使用できます。

<li *ngFor="let item of items | myfilter:filterargs">

あなたのパイプで:

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

@Pipe({
    name: 'myfilter',
    pure: false
})
export class MyFilterPipe implements PipeTransform {
    transform(items: any[], filter: Object): any {
        if (!items || !filter) {
            return items;
        }
        // filter items array, items which match and return true will be
        // kept, false will be filtered out
        return items.filter(item => item.title.indexOf(filter.title) !== -1);
    }
}

にパイプを登録することを忘れないでくださいapp.module.ts。パイプを登録する必要はありません@Component

import { MyFilterPipe } from './shared/pipes/my-filter.pipe';

@NgModule({
    imports: [
        ..
    ],
    declarations: [
        MyFilterPipe,
    ],
    providers: [
        ..
    ],
    bootstrap: [AppComponent]
})
export class AppModule { }

これは、カスタムフィルターパイプと組み込みのスライスパイプを使用して結果を制限するデモを行うPlunkerです。

(いくつかの解説者が指摘しているように)Angularに組み込みのフィルターパイプがない理由があること注意してください。


6
おかげで、これは意図したとおりに機能しますが、Ng2は「アイテム」がまだ定義されていないときにフィルターを適用しようとする可能性があるため、アイテム配列が定義されていてnullでないかどうかを確認する方が良い場合があります。
timmz 2016年

1
さらに、@ Component宣言にフィルタークラスを追加する必要がありました。Like:@Component({... pipes:[MyFilterPipe]
Stephen

1
配列が空の場合は、この行needsf(!items)return items; `も必要だと思います。
BoštjanPišler

2
アンギュラはパイプの問題を実行しているので、コンポーネント上でフィルタリングを行うことをお勧めします使用して言う
セバスティアン・ロハス

3
私はラップすることをお勧めしたい*ngForだけの混乱を避けるため、それが「変更プルーフ」にするために、括弧内のパラメータを:<li *ngFor="let item of (items | myfilter:filterargs)">
トマス・

104

多くの方が素晴らしいアプローチをとっていますが、ここでの目標は、一般的であり、* ngForとの関係ですべてのケースで非常に再利用可能な配列パイプを定義することです。

callback.pipe.ts(これをモジュールの宣言配列に追加することを忘れないでください)

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

@Pipe({
    name: 'callback',
    pure: false
})
export class CallbackPipe implements PipeTransform {
    transform(items: any[], callback: (item: any) => boolean): any {
        if (!items || !callback) {
            return items;
        }
        return items.filter(item => callback(item));
    }
}

次に、コンポーネントで、次のシグネチャ(item:any)=> booleanを使用するメソッドを実装する必要があります。たとえば、私の場合は、filterUserと呼び、18歳を超えるユーザーの年齢をフィルタリングします。

あなたのコンポーネント

@Component({
  ....
})
export class UsersComponent {
  filterUser(user: IUser) {
    return !user.age >= 18
  }
}

最後に重要なことですが、HTMLコードは次のようになります。

あなたのHTML

<li *ngFor="let user of users | callback: filterUser">{{user.name}}</li>

ご覧のとおり、このパイプは、コールバックを介してフィルター処理する必要があるアイテムなど、すべての配列にわたってかなり一般的です。私の場合、* ngForのようなシナリオに非常に役立つことがわかりました。

お役に立てれば!!!

codematrix


4
filterUser()関数またはそれに相当する関数で、コンポーネントクラスの他のすべての関数と同じように、「this」を使用して現在のコンポーネントインスタンスにアクセスできないことに気づきました。フィルターされたアイテムがコレクション内にあることを確認するには、コンポーネントオブジェクトにアクセスする必要があります。
ポール

1
@ポール、うーん...それは不可能です。メソッドはプライベートですか?プライベートはコンパイル構成のみであり、実行時に適用されないため、問題になることはありません。私の例では、IUserを使用しました。これは、反復されるコレクション内のアイテムがそれにマップされることを前提としています。あなたはそれが機能するかどうかを確認するためにどれでも試すことができます。また、名前が正しく入力されていることを確認してください。
code5

1
このメソッドを使用してコンポーネント変数にアクセスできない
suulisin

10
問題を回避するにはthis未定義さを、あなたは次のようにあなたのコンポーネントにあなたの方法を書くことができますfilterUser = (user: IUser) =>のではなくfilteruser(user: IUser)
トム

2
@Paul私はこれがあなたを助けるには遅すぎることを知っていますが、他の人を助けるかもしれません。thisコンポーネントメソッドで失われたのは、メソッドがコールバックとして使用され、新しいthisコンテキストが適用されたためです。オブジェクト指向のJavaScriptで一般的な問題に遭遇しましたが、古くて簡単な解決策があります。メソッドをバインドして、元のクラスへのコールバックとして使用します。コンストラクターに次のコードを追加しますthis.myCallbackFunc = this.myCallbackFunc.bind(this); 。二度と負けませんthis
Randolpho

36

簡略化された方法(パフォーマンスの問題のため、小さな配列でのみ使用されます。大きな配列では、コードを使用して手動でフィルターを作成する必要があります):

参照:https : //angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe

@Pipe({
    name: 'filter'
})
@Injectable()
export class FilterPipe implements PipeTransform {
    transform(items: any[], field : string, value : string): any[] {  
      if (!items) return [];
      if (!value || value.length == 0) return items;
      return items.filter(it => 
      it[field].toLowerCase().indexOf(value.toLowerCase()) !=-1);
    }
}

使用法:

<li *ngFor="let it of its | filter : 'name' : 'value or variable'">{{it}}</li>

変数を2番目の引数として使用する場合は、引用符を使用しないでください。


3
ReqExpと組み合わせる方法を示すために、次の行を追加する場合があります。return items.filter(item => {return new RegExp(value、 "i")。test(item [field])});
ヨハネス

8
Angularチームによると、これは悪い習慣と見なされています。

@torazaburoは彼らの意見を参照したり、理由を説明したりできますか?ありがとう
Zymotik

1
@Zymotik参照くださいangular.io/docs/ts/latest/guide/...

2
Angularチームによると、これは遅く、十分に縮小化されていないため、貧弱なコードです。チームはコードが原因で遅いウェブサイトを表示したくないため、今回はAngularに組み込みませんでした。angular.io/docs/ts/latest/guide/...
Zymotik

29

これは、パイプを使用せずに実装したものです。

component.html

<div *ngFor="let item of filter(itemsList)">

component.ts

@Component({
....
})
export class YourComponent {
  filter(itemList: yourItemType[]): yourItemType[] {
    let result: yourItemType[] = [];
    //your filter logic here
    ...
    ...
    return result;
  }
}

16
Angularは変更検出を実行するたびにフィルターを実行するため、これは計算負荷が大きいと思います。大規模な配列にはうまく対応しません。より複雑ですがコードは複雑ですが、itemListObservableを作成して非同期フィルターを使用することで解決できますlet item of itemsList | async。変更が発生した場合、オブザーバブルが新しいリストを出力するようにします。このように、フィルタリングコードは必要なときにのみ実行されます。
BeetleJuice 2017

1
この回答には負のスコアが必要です。悪い、パイプを使う。
セティア

19

いつ入ったかはわかりませんが、彼らはすでにそれを行うスライスパイプを作っています。それも文書化されています。

https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html

<p *ngFor="let feature of content?.keyFeatures | slice:1:5">
   {{ feature.description }}
</p>

4
trackByインターフェースを使用する場合、スライスパイプはの前に適用する必要があり;ます。例:*ngFor="let feature of content?.keyFeatures | slice:1:5; trackBy feature?.id"
フィリップ、

11

次のものも使用できます。

<template ngFor let-item [ngForOf]="itemsList">
    <div *ng-if="conditon(item)"></div>
</template>

これは、アイテムが条件に一致する場合にのみdivを表示します

詳細については、角度のドキュメントを参照してください。インデックスも必要な場合は、以下を使用します。

<template ngFor let-item [ngForOf]="itemsList" let-i="index">
    <div *ng-if="conditon(item, i)"></div>
</template>

1
これは、フィルターされたリストだけでなく、リスト内のすべてのアイテムのテンプレートに入りませんか?それはパフォーマンスに影響を与える可能性があります。
Azeroth2b

8

Angular2のパイプはコマンドラインのパイプに似ています。上記の各値の出力は、パイプの後にフィルターに送られます。これにより、次のようにフィルターを簡単にチェーンできます。

<template *ngFor="#item of itemsList">
    <div *ngIf="conditon(item)">{item | filter1 | filter2}</div>
</template>

これが誤解を招くものである場合は申し訳ありませんが、ここでの私のポイントは、変数itemfrom *ng-for="#item of itemsList"を使用して結果をそのようにフィルタリングする必要があるということ*ng-if="conditon(item)"です。これはこの例では機能しません..
Khaled

条件をフィルターにして、{{item | 条件}}条件はitem、条件が満たされている場合にのみ戻り、満たされていない場合は値を返しません。
Ben Glasser

@BenGlasserパイプは右から左に適用されると思いました。したがって、これは最初にfilter2を適用し、次にfilter1を適用します。
Evan Plaice

12
*ngForおよび*ngIf同じ要素ではサポートされていません。あなたはそれらのいずれかの明示的な形式に変更する必要がある<template ngFor ...>
ギュンターZöchbauer

1
@GünterZöchbauer1年かかりましたが、提案された変更を反映するように構文を更新しました
Ben Glasser '12年

5

この要件のために、汎用コンポーネントを実装して公開します。見る

https://www.npmjs.com/package/w-ng5

このコンポーネントを使用するには、前に、このパッケージをnpmでインストールします。

npm install w-ng5 --save

その後、app.moduleにモジュールをインポートします

...
import { PipesModule } from 'w-ng5';

次のステップで、app.moduleの宣言セクションを追加します。

imports: [
  PipesModule,
  ...
]

サンプルの使用

単純な文字列のフィルタリング

<input type="text"  [(ngModel)]="filtroString">
<ul>
  <li *ngFor="let s of getStrings() | filter:filtroString">
    {{s}}
  </li>
</ul>

複雑な文字列のフィルタリング-レベル2のフィールド「値」

<input type="text"  [(ngModel)]="search">
<ul>
  <li *ngFor="let s of getComplexTypesExtends() | filter:[{field:'n1.n2.valor2', value: search}]">
    {{s.nome}} - {{s.idade}} - {{s.n1.valor1}} - {{s.n1.n2.valor2}}
  </li>
</ul>

複雑な文字列のフィルタリング-中間フィールド-レベル1の「値」

<input type="text"  [(ngModel)]="search3">
<ul>
  <li *ngFor="let s of getComplexTypesExtends() | filter:[{field:'n1.valor1', value: search3}]">
    {{s.nome}} - {{s.idade}} - {{s.n1.valor1}} - {{s.n1.n2.valor2}}
  </li>
</ul>

単純な複雑な配列のフィルタリング-フィールド 'Nome'レベル0

<input type="text"  [(ngModel)]="search2">
<ul>
  <li *ngFor="let s of getComplexTypesExtends() | filter:[{field:'nome', value: search2}]">
    {{s.nome}} - {{s.idade}} - {{s.n1.valor1}} - {{s.n1.n2.valor2}}
  </li>
</ul>

ツリーフィールドでのフィルタリング-レベル2のフィールド 'Valor'またはレベル1の 'Valor'またはレベル0の 'Nome'

<input type="text"  [(ngModel)]="search5">
<ul>
  <li *ngFor="let s of getComplexTypesExtends() | filter:[{field:'n1.n2.valor2', value: search5}, {field:'n1.valor1', value: search5}, {field:'nome', value: search5}]">
    {{s.nome}} - {{s.idade}} - {{s.n1.valor1}} - {{s.n1.n2.valor2}}
  </li>
</ul>

存在しないフィールドのフィルタリング-存在しないレベル3の「Valor」

<input type="text"  [(ngModel)]="search4">
<ul>
  <li *ngFor="let s of getComplexTypesExtends() | filter:[{field:'n1.n2.n3.valor3', value: search4}]">
    {{s.nome}} - {{s.idade}} - {{s.n1.valor1}} - {{s.n1.n2.valor2}}
  </li>
</ul>

このコンポーネントは無限の属性レベルで動作します...


こんにちは、私はここにいます。すべての手順を実行しました。この場合、これを使用*ngFor="let inovice of invoices | filter:searchInvoice"していて、リストを検索していますが、空白のリストが表示されていますが、なぜですか。
-jecorrales

1
こんにちは、請求書のリストに含まれるオブジェクトの構造とタイプを教えてください。 請求書リストのタイプが文字列の場合にのみ、それを使用する方法を適用する必要があります。 請求書番号(invoice.number)で検索する場合は、これを使用します:* ngFor = "let inovice of invoices | filter:{field:number、value:searchInvoice}"。2つの列(invoice.customer.nameなど)でフィルタリングする場合は、* ngFor = "let inovice of invoices | filter:[field:number、value:searchInvoice}、{field:customer.name、value: searchInvoice}]
Wedson Quintanilhaダ・シルバ

4

Angular 6と連携してngForをフィルタリングする簡単なソリューションは次のとおりです。

<span *ngFor="item of itemsList"  >
  <div *ngIf="yourCondition(item)">
    
    your code
    
  </div>
</span

スパンは本質的に何も表さないので便利です。


1
HTMLノイズに加えてCSSに影響を与える可能性のある不要なマークアップを追加しないため、<span>よりも<ng-container>を使用することをお勧めします。
Trevor de Koekkoek

4

私はそれが古い質問であることを知っていますが、別の解決策を提供することが役立つと思いました。

これのAngularJSに相当

<div *ng-for="#item of itemsList" *ng-if="conditon(item)"></div>

Angular 2+では、同じ要素に対して* ngForと* ngIfを使用できないため、次のようになります。

<div *ngFor="let item of itemsList">
     <div *ngIf="conditon(item)">
     </div>
</div>

内部コンテナとして使用できない場合は、代わりにng-containerを使用してください。ng-containerは、アプリケーションで要素のグループを条件付きで追加したい(つまり* ngIf = "foo"を使用したい)が、それらを別の要素でラップしたくない場合に役立ちます。


4

私はここや他の場所での回答に基づいてプランカーを作成しました。

さらに、私は追加する必要がありました@Input@ViewChildElementRef<input>作成およびsubscribe()それを観測可能に。

Angular2検索フィルター:PLUNKR(更新:plunkerは機能しなくなりました)


3

パイプが最善のアプローチでしょう。しかし、1つ以下でも機能します。

<div *ng-for="#item of itemsList">
  <ng-container *ng-if="conditon(item)">
    // my code
  </ng-container>
</div>

これは特定のものを壊す可能性があります。たとえば、マットフォームフィールドの内部
pcnate

2

これは私のコードです:

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

@Pipe({
    name: 'filter'
})
@Injectable()
export class FilterPipe implements PipeTransform {
    transform(items: any[], field : string, value): any[] {
      if (!items) return [];
      if (!value || value.length === 0) return items;
      return items.filter(it =>
      it[field] === value);
    }
}

サンプル:

LIST = [{id:1,name:'abc'},{id:2,name:'cba'}];
FilterValue = 1;

<span *ngFor="let listItem of LIST | filter : 'id' : FilterValue">
                              {{listItem .name}}
                          </span>

1

アプリケーション固有のフィルターに使用したい別のアプローチは、コンポーネントでカスタムの読み取り専用プロパティを使用することです。これにより、カスタムパイプ(IMHO)を使用するよりもきれいにフィルタリングロジックをカプセル化できます。

たとえば、バインドしalbumListてフィルタリングしたい場合searchText

searchText: "";
albumList: Album[] = [];

get filteredAlbumList() {
    if (this.config.searchText && this.config.searchText.length > 1) {
      var lsearchText = this.config.searchText.toLowerCase();
      return this.albumList.filter((a) =>
        a.Title.toLowerCase().includes(lsearchText) ||
        a.Artist.ArtistName.toLowerCase().includes(lsearchText)
      );
    }
    return this.albumList;
}

HTMLでバインドするには、読み取り専用プロパティにバインドします。

<a class="list-group-item"
       *ngFor="let album of filteredAlbumList">
</a>

特定のアプリケーションに特化したフィルターについては、コンポーネントにフィルターに関連するロジックを保持するため、パイプよりもうまく機能します。

パイプは、グローバルに再利用可能なフィルターに適しています。


1
このメソッドは、valueChangedアプローチを使用する代わりに、継続的なダーティチェックをトリガーしませんか?
レオン・ペルティエ

1

リストから必要なアイテムを取得するために次のパイプを作成しました。

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

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

  transform(items: any[], filter: string): any {
    if(!items || !filter) {
      return items;
    }
    // To search values only of "name" variable of your object(item)
    //return items.filter(item => item.name.toLowerCase().indexOf(filter.toLowerCase()) !== -1);

    // To search in values of every variable of your object(item)
    return items.filter(item => JSON.stringify(item).toLowerCase().indexOf(filter.toLowerCase()) !== -1);
  }

}

小文字の変換は、大文字と小文字を区別しない方法で一致させるためのものです。あなたはこのようにあなたのビューでそれを使うことができます:-

<div>
  <input type="text" placeholder="Search reward" [(ngModel)]="searchTerm">
</div>
<div>
  <ul>
    <li *ngFor="let reward of rewardList | filter:searchTerm">
      <div>
        <img [src]="reward.imageUrl"/>
        <p>{{reward.name}}</p>
      </div>
    </li>
  </ul>
</div>

1

理想的には、そのために角度のある2パイプを作成する必要があります。しかし、あなたはこのトリックを行うことができます。

<ng-container *ngFor="item in itemsList">
    <div*ngIf="conditon(item)">{{item}}</div>
</ng-container>

1

上記で提案された非常にエレガントなコールバックパイプソリューションに基づいて、追加のフィルターパラメーターを渡すことができるようにすることで、少し一般化することができます。次に、

callback.pipe.ts

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

@Pipe({
  name: 'callback',
  pure: false
})
export class CallbackPipe implements PipeTransform {
  transform(items: any[], callback: (item: any, callbackArgs?: any[]) => boolean, callbackArgs?: any[]): any {
    if (!items || !callback) {
      return items;
    }
    return items.filter(item => callback(item, callbackArgs));
  }
}

成分

filterSomething(something: Something, filterArgs: any[]) {
  const firstArg = filterArgs[0];
  const secondArg = filterArgs[1];
  ...
  return <some condition based on something, firstArg, secondArg, etc.>;
}

html

<li *ngFor="let s of somethings | callback : filterSomething : [<whatWillBecomeFirstArg>, <whatWillBecomeSecondArg>, ...]">
  {{s.aProperty}}
</li>

0

ここに私がしばらく前に作成し、ブログに書いた例があり、これには有効なプランクが含まれています。オブジェクトの任意のリストをフィルタリングできるフィルターパイプを提供します。基本的には、ngFor仕様内でプロパティと値{key:value}を指定するだけです。

@NateMayの応答とそれほど変わりませんが、比較的詳細に説明しています。

私の場合、ユーザーが入力したテキスト(filterText)の順序付けられていないリストを、次のようなマークアップを使用して、配列内のオブジェクトの "label"プロパティに対してフィルター処理しました。

<ul>
  <li *ngFor="let item of _items | filter:{label: filterText}">{{ item.label }}</li>
</ul>

https://long2know.com/2016/11/angular2-filter-pipes/


0

@Pipecomponent.tsファイルでFilterを作成する最初のステップ:

your.component.ts

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

@Pipe({
  name: 'searchfilter'
})
@Injectable()
export class SearchFilterPipe implements PipeTransform {
  transform(items: Person[], value: string): any[] {
    if (!items || !value) {
      return items;
    }
    console.log("your search token = "+value);
    return items.filter(e => e.firstName.toLowerCase().includes(value.toLocaleLowerCase()));
  }
}
@Component({
  ....
    persons;

    ngOnInit() {
         //inicial persons arrays
    }
})

そしてPersonオブジェクトのデータ構造:

person.ts

export class Person{
    constructor(
        public firstName: string,
        public lastName: string
    ) { }
}

HTMLファイルのビューで:

your.component.html

    <input class="form-control" placeholder="Search" id="search" type="text" [(ngModel)]="searchText"/>
    <table class="table table-striped table-hover">
      <colgroup>
        <col span="1" style="width: 50%;">
        <col span="1" style="width: 50%;">
      </colgroup>
      <thead>
        <tr>
          <th>First name</th>
          <th>Last name</th>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let person of persons | searchfilter:searchText">
          <td>{{person.firstName}}</td>
          <td>{{person.lastName}}</td>
        </tr>
      </tbody>
    </table>

0

これはあなたの配列です

products: any = [
        {
            "name": "John-Cena",
                    },
        {
            "name": "Brock-Lensar",

        }
    ];

これはあなたのngForループですFilter By:

<input type="text" [(ngModel)]='filterText' />
    <ul *ngFor='let product of filterProduct'>
      <li>{{product.name }}</li>
    </ul>

そこで、元のデータを保持したいので、製品のfilterProductインスタントを使用しています。ここでは、モデル_filterTextが入力ボックスとして使用されています。変更がある場合は常に、セッター関数が呼び出されます。setFilterTextでは、performProductが呼び出され、入力と一致する人だけに結果を返します。大文字と小文字を区別しないために小文字を使用しています。

filterProduct = this.products;
_filterText : string;
    get filterText() : string {
        return this._filterText;
    }

    set filterText(value : string) {
        this._filterText = value;
        this.filterProduct = this._filterText ? this.performProduct(this._filterText) : this.products;

    } 

    performProduct(value : string ) : any {
            value = value.toLocaleLowerCase();
            return this.products.filter(( products : any ) => 
                products.name.toLocaleLowerCase().indexOf(value) !== -1);
        }

0

少しググった後、私は出会ったng2-search-filter。Inはオブジェクトを取得し、一致するものを探すすべてのオブジェクトプロパティに対して検索用語を適用します。


0

私はオブジェクトを渡すフィルターを作るための何かを見つけていました、そして私はマルチフィルターのようにそれを使うことができます: マルチフィルターの例

私はこの美容ソリューションをしました:

filter.pipe.ts

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

@Pipe({
  name: 'filterx',
  pure: false
})
export class FilterPipe implements PipeTransform {
 transform(items: any, filter: any, isAnd: boolean): any {
  let filterx=JSON.parse(JSON.stringify(filter));
  for (var prop in filterx) {
    if (Object.prototype.hasOwnProperty.call(filterx, prop)) {
       if(filterx[prop]=='')
       {
         delete filterx[prop];
       }
    }
 }
if (!items || !filterx) {
  return items;
}

return items.filter(function(obj) {
  return Object.keys(filterx).every(function(c) {
    return obj[c].toLowerCase().indexOf(filterx[c].toLowerCase()) !== -1
  });
  });
  }
}

component.ts

slotFilter:any={start:'',practitionerCodeDisplay:'',practitionerName:''};

componet.html

             <tr>
                <th class="text-center">  <input type="text" [(ngModel)]="slotFilter.start"></th>
                <th class="text-center"><input type="text" [(ngModel)]="slotFilter.practitionerCodeDisplay"></th>
                <th class="text-left"><input type="text" [(ngModel)]="slotFilter.practitionerName"></th>
                <th></th>
              </tr>


 <tbody *ngFor="let item of practionerRoleList | filterx: slotFilter">...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.