Saya memiliki mat-pilih di mana opsi adalah semua objek yang ditentukan dalam array. Saya mencoba untuk mengatur nilai ke default ke salah satu opsi, namun itu dibiarkan dipilih saat halaman dirender.
File skrip ketikan saya berisi:
public options2 = [
{"id": 1, "name": "a"},
{"id": 2, "name": "b"}
]
public selected2 = this.options2[1].id;
File HTML saya berisi:
<div>
<mat-select
[(value)]="selected2">
<mat-option
*ngFor="let option of options2"
value="{{ option.id }}">
{{ option.name }}
</mat-option>
</mat-select>
</div>
Saya telah mencoba menyetel selected2
dan value
masuk mat-option
ke objek dan id itu, dan telah mencoba menggunakan keduanya[(value)]
dan [(ngModel)]
di mat-select
, tetapi tidak ada yang berfungsi.
Saya menggunakan materi versi 2.0.0-beta.10
angular
typescript
angular-material2
William Moore
sumber
sumber
compareWith
. Lebih elegan.compareWith
DIMILIKI, lihat jawaban badis di sini stackoverflow.com/questions/47333171/…Jawaban:
Gunakan pengikatan untuk nilai di template Anda.
seharusnya
Dan dalam penggunaan nilai yang Anda pilih,
ngModel
bukanvalue
.seharusnya
Kode lengkap:
Di samping catatan pada versi 2.0.0-beta.12 pemilihan material sekarang menerima
mat-form-field
elemen sebagai elemen induk sehingga konsisten dengan kontrol masukan material lainnya. Gantidiv
elemen denganmat-form-field
elemen setelah Anda meningkatkan.sumber
mat-form-field
, ini..."used to wrap several Angular Material components and apply common Text field styles"
, jadi bukan hal yang sama. Selain itu OP dan juga jawaban saya tidak menyebutkanFormControl
,FormGroup
, atauFormControlName
.[compareWith]
direktif adalah apa yang kami gunakanGunakan
compareWith
, fungsi untuk membandingkan nilai opsi dengan nilai yang dipilih. lihat di sini: https://material.angular.io/components/select/api#MatSelectUntuk objek dengan struktur berikut:
Tentukan markup seperti ini:
Dan tentukan fungsi perbandingan seperti ini:
sumber
Saya menggunakan Angular 5 dan bentuk reaktif dengan mat-pilih dan tidak bisa mendapatkan salah satu solusi di atas untuk menampilkan nilai awal.
Saya harus menambahkan [bandingkanWith] untuk menangani berbagai jenis yang digunakan dalam komponen mat-pilih. Secara internal, mat-pilih menggunakan array untuk menampung nilai yang dipilih. Ini memungkinkan kode yang sama untuk bekerja dengan beberapa pilihan jika mode itu diaktifkan.
Angular Select Control Doc
Inilah solusi saya:
Form Builder untuk menginisialisasi kontrol formulir:
Kemudian implementasikan fungsi bandingkanWith pada komponen Anda:
Selanjutnya buat dan ekspor fungsi determId (saya harus membuat fungsi mandiri sehingga mat-pilih dapat menggunakannya):
Terakhir tambahkan atribut bandingkanWith ke mat-pilih Anda:
sumber
Anda harus mengikatnya seperti
[value]
dimat-option
bawah ini,DEMO LANGSUNG
sumber
Anda cukup menerapkan fungsi perbandingan Anda sendiri
[compareWith]="compareItems"
Lihat juga dokumennya . Jadi kode lengkapnya akan terlihat seperti ini:
dan di file Ketikan:
sumber
i1
ataui2
tidak akan ada.Seperti yang telah disebutkan di Angular 6 menggunakan ngModel dalam bentuk reaktif tidak digunakan lagi (dan dihapus di Angular 7), jadi saya memodifikasi template dan komponennya sebagai berikut.
Templatenya:
Bagian utama komponen (
onChanges
dan detail lainnya dihilangkan):Catat this.filter.setValue (this.selected) di
ngOnInit
atas.Tampaknya berfungsi di Angular 6.
sumber
[compareWith]
hebatSaya melakukannya seperti dalam contoh ini. Mencoba untuk mengatur nilai mat-pilih ke nilai dari salah satu mat-pilihan. Tapi gagal.
Kesalahan saya adalah melakukan [(value)] = "someNumberVariable" ke variabel tipe numerik sedangkan yang ada di opsi-mat adalah string. Bahkan jika mereka tampak sama di template itu tidak akan memilih opsi itu.
Setelah saya mengurai someNumberVariable menjadi string semuanya baik-baik saja.
Jadi sepertinya Anda perlu memiliki mat-pilih dan nilai mat-option tidak hanya angka yang sama (jika Anda menyajikan angka) tetapi juga membiarkannya menjadi tipe string.
sumber
Solusi bagi saya adalah:
TS:
Menggunakan objek: {id: number, detalle: string}
sumber
Coba ini!
sumber
Solusi saya sedikit rumit dan sederhana.
Saya baru saja menggunakan placeholder . Warna default placeholder material adalah
light gray
. Agar terlihat seperti opsi yang dipilih, saya hanya memanipulasi CSS sebagai berikut:sumber
Pengikatan atau pengaturan nilai default hanya berfungsi jika atribut nilai pada MatSelect sebanding dengan atribut nilai yang diikat ke MatOption . Jika Anda mengikat
caption
item ke atribut value dari elemen mat-option, Anda juga harus menyetel elemen default pada mat-select kecaption
item Anda. Jika Anda mengikatId
item Anda ke mat-option , Anda harus mengikatid
ke mat-select juga, bukan keseluruhan item, caption atau lainnya, hanya bidang yang sama.Tetapi Anda perlu melakukannya dengan mengikat []
sumber
Saya mengikuti langkah-langkah di atas dengan sangat hati-hati dan masih belum bisa memilih nilai awal.
Alasannya adalah meskipun nilai terikat saya didefinisikan sebagai string dalam skrip tipe, API backend saya mengembalikan angka.
Pengetikan longgar Javascript hanya mengubah jenis saat runtime (tanpa kesalahan), yang mencegah pemilihan nilai awal.
Komponen
Template
Solusinya adalah memperbarui API untuk mengembalikan nilai string.
sumber
Cara yang sangat sederhana untuk mencapai ini adalah menggunakan
formControl
dengan nilai default, di dalam aFormGroup
(opsional) misalnya. Ini adalah contoh menggunakan selektor unit ke input area:ts
html
sumber
Perbandingan antara angka dan string digunakan untuk menjadi salah , jadi, berikan nilai yang Anda pilih ke string dalam ngOnInit dan itu akan berhasil.
Saya memiliki masalah yang sama, saya mengisi mat-pilih dengan enum, menggunakan
dan saya memiliki nilai enum yang ingin saya pilih ...
Saya menghabiskan beberapa jam berjuang dengan pikiran saya mencoba untuk mengidentifikasi mengapa itu tidak berhasil. Dan saya melakukannya setelah merender semua variabel yang digunakan di mat-pilih, koleksi kunci dan yang dipilih ... jika Anda memiliki ["0", "1", "2"] dan ingin memilih 1 ( yang merupakan angka) 1 == "1" salah dan karena itu tidak ada yang dipilih.
jadi, solusinya adalah memberikan Anda nilai yang dipilih ke string dalam ngOnInit dan itu akan berhasil.
sumber
Saya melakukan ini.
Biasanya Anda bisa melakukannya
[value]="option"
, kecuali Anda mendapatkan opsi dari beberapa database ?? Saya pikir baik penundaan mendapatkan data menyebabkannya tidak berfungsi, atau objek yang didapat berbeda dalam beberapa hal meskipun mereka sama ?? Cukup aneh kemungkinan besar yang kemudian, karena saya juga mencoba[value]="option === selected ? selected : option"
dan tidak berhasil.sumber
TS
HTML
sumber
sumber