私は、オブジェクトの配列を表示するngForを持つページがあるプロジェクトで作業しています。私は、入力フィールドに特定のキーワードを入力することによって、これらのオブジェクトをフィルタリングする機能をユーザーに与えたいと考えています。角4 - フィルタリング中に200ミリ秒ごとにHTTPリクエストを1つに制限する
データのフィルタリングはサーバー側で行う必要があるため、私はこのサービスを私のサービスで実装しました。
public searchProperties(query: string): Observable<IProperty[]> {
console.log('SERVICE: query: ' + query);
let params = new HttpParams();
params = params.append('q', query);
return this.http.get<IProperty[]>(this.baseUrl+'/api/property', {params: params})
.do(response => {
console.log('Successfully retrieved the search response');
}).catch((error: HttpErrorResponse) => {
console.log('Something went wrong while retrieving the search response');
return Observable.throw(error);
})
}
私はこのようなパイプでこのメソッドを呼び出します。
transform(items: IProperty[], searchText: string): any[] {
if(!items) return [];
if(!searchText) return items;
console.log('PIPE: Amount of items in items array BEFORE: ' + items.length);
this.propertyService.searchProperties(searchText).subscribe(
result => {
items = result;
}, error => {
console.log('Failed to retrieve the properties that were searched for');
return items;
},
() => {
console.log('PIPE: Amount of items in items array AFTER: ' + items.length);
return items;
}
)
}
私はこのようなHTMLで私ngForにパイプを追加しました:
<div class="col-md-4" *ngFor="let property of properties | property_filter : searchText ; let i=index">
私には二つの問題があります。現在のコード:
ev入力フィールドにキーワードを入力すると、httpコールが呼び出され、パイプへの応答が返されますが、ページにはオブジェクトが表示されません。入力フィールドを再度クリアするまで、ngForは空のままです。
入力中に、HTTP呼び出しは、1回の変更イベントではなく、200ミリ秒ごとにオフにする必要があります。
ありがとうございます!
UPDATE:
Iパイプを削除し、コンポーネントにコールを実施しました。オブジェクトのリストが正しく更新されるようになりました。
残っている唯一の質問は、応答の量を200ミリ秒ごとに1つに制限する方法です。
あなたは 'autocomplete'を再実装していますか?このパッケージを見てくださいhttps://www.npmjs.com/package/ng2-auto-complete –
なぜあなたはあなたのパイプ変換コードでサービスを使用して再びフィルタリングするよりもプロパティ配列を渡している場合??? –
あなたはパイプを間違った方法で使用しようとしているようです –