Rupanya, Angular 2 akan menggunakan pipa bukan filter seperti pada Angular1 bersamaan dengan ng-untuk menyaring hasil, meskipun implementasinya tampaknya masih samar-samar, tanpa dokumentasi yang jelas.
Yaitu apa yang saya coba capai dapat dilihat dari perspektif berikut
<div *ng-for="#item of itemsList" *ng-if="conditon(item)"></div>
Bagaimana cara mengimplementasikannya menggunakan pipa?
angular
typescript
Khaled
sumber
sumber
<div *ngFor="let item of itemsList" *ngIf="conditon(item)" ...
*ngFor
dan*ngIf
pada elemen yang sama tidak didukung. Anda perlu mengubah ke bentuk eksplisit untuk salah satu dari mereka"Jawaban:
Pada dasarnya, Anda menulis pipa yang kemudian dapat Anda gunakan dalam
*ngFor
arahan.Di komponen Anda:
Di templat Anda, Anda bisa meneruskan string, angka atau objek ke pipa Anda untuk digunakan untuk memfilter:
Di pipa Anda:
Ingatlah untuk mendaftarkan pipa Anda ke
app.module.ts
; Anda tidak perlu lagi mendaftar pipa di@Component
Inilah Plunker yang melakukan demo penggunaan pipa filter khusus dan pipa slice bawaan untuk membatasi hasil.
Harap perhatikan (seperti yang ditunjukkan beberapa komentator) bahwa ada alasan mengapa tidak ada pipa filter bawaan di Angular.
sumber
*ngFor
parameter dalam tanda kurung, hanya untuk menghindari kebingungan dan menjadikannya "bukti perubahan":<li *ngFor="let item of (items | myfilter:filterargs)">
Banyak dari Anda memiliki pendekatan hebat, tetapi tujuannya di sini adalah untuk menjadi generik dan mendefinisikan pipa array yang sangat dapat digunakan kembali di semua kasus dalam hubungannya dengan * ngFor.
callback.pipe.ts (jangan lupa menambahkan ini ke array deklarasi modul Anda)
Kemudian di komponen Anda, Anda perlu menerapkan metode dengan signuature berikut (item: any) => boolean , dalam kasus saya misalnya, saya menyebutnya filterUser, yang memfilter usia pengguna yang lebih dari 18 tahun.
Komponen Anda
Dan yang tak kalah pentingnya, kode html Anda akan terlihat seperti ini:
HTML Anda
Seperti yang Anda lihat, Pipa ini cukup umum di semua array seperti item yang perlu disaring melalui panggilan balik. Di mycase, saya menemukan itu sangat berguna untuk * skenario ngFor.
Semoga ini membantu!!!
codematrix
sumber
this
yang terdefinisi, Anda dapat menulis metode Anda pada komponen Anda sepertifilterUser = (user: IUser) =>
daripadafilteruser(user: IUser)
this
pada metode komponen Anda adalah karena metode itu digunakan sebagai panggilan balik danthis
konteks baru diterapkan. Anda mengalami masalah umum dalam javascript berorientasi objek, tetapi ada solusi lama dan mudah: Anda mengikat metode yang akan digunakan sebagai panggilan balik ke kelas asli. Di konstruktor Anda, tambahkan kode berikut:this.myCallbackFunc = this.myCallbackFunc.bind(this);
Itu dia. Anda tidak akan pernah kehilanganthis
lagi.Cara yang disederhanakan (Digunakan hanya pada array kecil karena masalah kinerja. Dalam array besar Anda harus membuat filter secara manual melalui kode):
Lihat: https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
Pemakaian:
Jika Anda menggunakan variabel sebagai argumen kedua, jangan gunakan tanda kutip.
sumber
Inilah yang saya terapkan tanpa menggunakan pipa.
component.html
komponen.ts
sumber
itemList
sebuah diamati dan menggunakan filter async:let item of itemsList | async
. Ketika perubahan terjadi, buat yang terpantau mengeluarkan daftar baru. Dengan cara ini, kode penyaringan hanya dijalankan saat dibutuhkan.Saya tidak yakin kapan itu masuk tetapi mereka sudah membuat pipa slice yang akan melakukan itu. Juga didokumentasikan dengan baik.
https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html
sumber
;
. mis:*ngFor="let feature of content?.keyFeatures | slice:1:5; trackBy feature?.id"
Anda juga dapat menggunakan yang berikut ini:
Ini hanya akan menampilkan div jika item Anda sesuai dengan kondisi
Lihat dokumentasi sudut untuk informasi lebih lanjut. Jika Anda juga memerlukan indeks, gunakan yang berikut ini:
sumber
pipa di Angular2 mirip dengan pipa di baris perintah. Output dari masing-masing nilai sebelumnya dimasukkan ke filter setelah pipa yang membuatnya mudah untuk rantai filter juga seperti ini:
sumber
item
dari yang*ng-for="#item of itemsList"
seharusnya digunakan untuk memfilter hasil*ng-if="conditon(item)"
. Yang tidak berfungsi dalam contoh ini ..item
jika kondisi terpenuhi dan tidak ada nilai jika tidak.*ngFor
dan*ngIf
pada elemen yang sama tidak didukung. Anda perlu mengubah ke bentuk eksplisit untuk salah satunya<template ngFor ...>
Untuk persyaratan ini, saya menerapkan dan menerbitkan komponen generik . Lihat
https://www.npmjs.com/package/w-ng5
Untuk menggunakan komponen ini, sebelumnya, instal paket ini dengan npm:
Setelah itu, impor modul di app.module
Pada langkah selanjutnya, tambahkan bagian menyatakan di app.module:
Penggunaan sampel
Memfilter string sederhana
Memfilter string kompleks - bidang 'Nilai' di level 2
Memfilter string kompleks - bidang tengah - 'Nilai' di level 1
Memfilter array sederhana yang kompleks - bidang 'Nome' level 0
Memfilter di bidang pohon - bidang 'Valor' di level 2 atau 'Valor' di level 1 atau 'Nome' di level 0
Memfilter bidang yang tidak ada - 'Valor' di level 3 yang tidak ada
Komponen ini berfungsi dengan level atribut ...
sumber
*ngFor="let inovice of invoices | filter:searchInvoice"
dan sedang mencari di daftar saya, tetapi menunjukkan daftar kosong, apakah Anda tahu mengapa?Solusi sederhana yang berfungsi dengan Angular 6 untuk memfilter ngFor, berikut ini:
Rentang berguna karena tidak secara inheren mewakili apa pun.
sumber
Saya tahu ini pertanyaan lama, namun saya pikir mungkin ada gunanya menawarkan solusi lain.
setara dengan AngularJS ini
dalam Angular 2+ Anda tidak dapat menggunakan * ngFor dan * ngIf pada elemen yang sama, jadi akan menjadi berikut:
dan jika Anda tidak dapat menggunakan wadah internal gunakan wadah-ng sebagai gantinya. ng-container berguna ketika Anda ingin menambahkan sekelompok elemen secara kondisional (yaitu menggunakan * ngIf = "foo") dalam aplikasi Anda tetapi tidak ingin membungkusnya dengan elemen lain.
sumber
Saya telah membuat plunker berdasarkan jawaban di sini dan di tempat lain.
Selain itu saya harus menambahkan
@Input
,@ViewChild
, danElementRef
dari<input>
serta membuat dansubscribe()
ke diamati itu.Filter Pencarian Angular2 : PLUNKR (UPDATE: plunker tidak lagi berfungsi)
sumber
Pipa akan menjadi pendekatan terbaik. tetapi di bawah satu juga akan berfungsi.
sumber
Ini kode saya:
Sampel:
sumber
Pendekatan lain yang saya suka gunakan untuk aplikasi filter spesifik, adalah dengan menggunakan properti read-only kustom pada komponen Anda yang memungkinkan Anda untuk merangkum logika penyaringan lebih bersih daripada menggunakan pipa kustom (IMHO).
Misalnya, jika saya ingin mengikat
albumList
dan memfiltersearchText
:Untuk mengikat dalam HTML, Anda kemudian dapat mengikat ke properti hanya-baca:
Saya menemukan untuk filter khusus yang spesifik aplikasi ini berfungsi lebih baik daripada pipa karena membuat logika yang terkait dengan filter dengan komponen.
Pipa bekerja lebih baik untuk filter yang dapat digunakan kembali secara global.
sumber
Saya membuat pipa berikut untuk mendapatkan barang yang diinginkan dari daftar.
Konversi huruf kecil hanya untuk mencocokkan jika cara tidak sensitif. Anda dapat menggunakannya dalam tampilan seperti ini: -
sumber
Idealnya Anda harus membuat 2 pipa angual untuk itu. Tetapi Anda bisa melakukan trik ini.
sumber
Berdasarkan solusi pipa callback yang sangat elegan yang diusulkan di atas, dimungkinkan untuk menggeneralisasikannya sedikit lebih jauh dengan memungkinkan parameter filter tambahan untuk diteruskan. Kami kemudian memiliki:
callback.pipe.ts
komponen
html
sumber
Berikut adalah contoh yang saya buat beberapa waktu lalu, dan di-blog, tentang yang termasuk plunk yang berfungsi. Ini menyediakan pipa filter yang dapat menyaring daftar objek. Anda pada dasarnya hanya menentukan properti dan nilai {key: value} dalam spesifikasi ngFor Anda.
Tidak jauh berbeda dari respons @ NateMay, kecuali saya jelaskan dengan detail yang relatif verbose.
Dalam kasus saya, saya memfilter daftar tidak terurut pada beberapa teks (filterText) yang dimasukkan pengguna terhadap properti "label" objek dalam array saya dengan semacam mark-up:
https://long2know.com/2016/11/angular2-filter-pipes/
sumber
Langkah pertama Anda membuat Filter menggunakan
@Pipe
file component.ts Anda:your.component.ts
Dan struktur data objek Person:
person.ts
Dalam tampilan Anda di file html:
your.component.html
sumber
Ini array Anda
Ini adalah loop ngFor Anda. Oleh:
Di sana saya menggunakan produk instan filterProduct, karena saya ingin menyimpan data asli saya. Di sini model _filterText digunakan sebagai kotak input. Ketika ada perubahan fungsi setter akan memanggil. Dalam setFilterText performProduct disebut itu akan mengembalikan hasil hanya mereka yang cocok dengan input. Saya menggunakan huruf kecil untuk huruf besar-kecil.
sumber
Setelah beberapa googling, saya menemukan
ng2-search-filter
. Di akan mengambil objek Anda dan menerapkan istilah pencarian terhadap semua properti objek yang mencari kecocokan.sumber
Saya menemukan sesuatu untuk membuat filter yang melewati Objek, maka saya dapat menggunakannya seperti multi-filter:
saya melakukan Solusi Kecantikan ini:
filter.pipe.ts
komponen.ts
componentset.html
sumber