Diberikan daftar kotak centang yang terikat ke yang sama formControlName
, bagaimana saya bisa menghasilkan larik nilai kotak centang yang terikat ke formControl
, bukan hanya true
/ false
?
Contoh:
<form [formGroup]="checkboxGroup">
<input type="checkbox" id="checkbox-1" value="value-1" formControlName="myValues" />
<input type="checkbox" id="checkbox-2" value="value-2" formControlName="myValues" />
<input type="checkbox" id="checkbox-3" value="value-2" formControlName="myValues" />
</form>
checkboxGroup.controls['myValues'].value
saat ini memproduksi:
true or false
Apa yang saya ingin hasilkan:
['value-1', 'value-2', ...]
javascript
angular
checkbox
angular2-forms
ReactingToAngularVues
sumber
sumber
Jawaban:
Dengan bantuan jawaban silentsod, saya menulis solusi untuk mendapatkan nilai alih-alih status di formBuilder saya.
Saya menggunakan metode untuk menambah atau menghapus nilai di formArray. Ini mungkin pendekatan yang buruk, tetapi berhasil!
component.html
component.ts
Saat saya mengirimkan formulir saya, misalnya model saya terlihat seperti:
Hanya satu hal yang hilang, fungsi untuk mengisi formArray jika model Anda sudah memeriksa nilai.
sumber
myChoices: new FormArray([], Validators.required)
Ini tempat yang bagus untuk menggunakan file
FormArray
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.htmlUntuk memulai kita akan membangun berbagai kontrol kita baik dengan a
FormBuilder
atau yang baru aFormArray
FormBuilder
FormArray baru
Cukup mudah untuk dilakukan, tetapi kemudian kita akan mengubah template kita dan membiarkan mesin template menangani bagaimana kita mengikat kontrol kita:
template.html
Di sini kami mengulangi set kami
FormControls
di kamimyValues
FormArray
dan untuk setiap kontrol kami mengikat[formControl]
kontrol itu alih-alih keFormArray
kontrol dan<div>{{checkboxGroup.controls['myValues'].value}}</div>
produksitrue,false,true
sementara juga membuat sintaks template Anda sedikit lebih manual.Anda dapat menggunakan contoh ini: http://plnkr.co/edit/a9OdMAq2YIwQFo7gixbj?p=preview untuk melihat-lihat
sumber
*ngFor="let control of checkboxGroup.controls['myValues'].controls ; let i=index""
Ini jauh lebih mudah untuk melakukan ini di Angular 6 daripada di versi sebelumnya, bahkan ketika informasi kotak centang diisi secara asinkron dari API.
Hal pertama yang harus disadari adalah bahwa berkat
keyvalue
pipa Angular 6 kita tidak perlu menggunakanFormArray
lagi, dan sebagai gantinya dapat membuat sarang aFormGroup
.Pertama, teruskan FormBuilder ke konstruktor
Kemudian inisialisasi formulir kita.
Saat data opsi kotak centang kami tersedia, lakukan iterasi dan kami dapat mendorongnya langsung ke dalam nested
FormGroup
sebagai namaFormControl
, tanpa harus bergantung pada array pencarian indeks nomor.Terakhir, dalam template kita hanya perlu mengulang
keyvalue
kotak centang: tidak ada tambahanlet index = i
, dan kotak centang secara otomatis akan berada dalam urutan abjad: jauh lebih bersih.sumber
const checkboxes = ..
luar depan;)Jika Anda mencari nilai kotak centang dalam format JSON
Contoh lengkapnya di sini .
Saya minta maaf karena menggunakan Nama Negara sebagai nilai kotak centang daripada yang ada dalam pertanyaan. Penjelasan lebih lanjut -
Buat FormGroup untuk formulir
Biarkan setiap kotak centang menjadi Grup Form yang dibangun dari objek yang satu-satunya properti adalah nilai kotak centang.
Array FormGroups untuk kotak centang digunakan untuk mengatur kontrol untuk 'negara' di Formulir induk.
Di template, gunakan pipa untuk mendapatkan nama kontrol kotak centang
sumber
Saya tidak melihat solusi di sini yang sepenuhnya menjawab pertanyaan menggunakan formulir reaktif sepenuhnya jadi inilah solusi saya untuk hal yang sama.
Ringkasan
Berikut inti dari penjelasan mendetail bersama dengan contoh StackBlitz.
FormArray
untuk kotak centang dan inisialisasi formulir.valueChanges
diamati adalah sempurna untuk ketika Anda ingin bentuk untuk tampilan sesuatu tapi toko sesuatu yang lain dalam komponen tersebut. Petakantrue
/false
values ke nilai yang diinginkan di sini.false
nilainya pada saat pengiriman.valueChanges
observable.Contoh StackBlitz
Penjelasan detail
Gunakan FormArray untuk menentukan formulir
Seperti yang sudah disebutkan dalam jawaban ditandai sebagai benar.
FormArray
adalah cara untuk pergi dalam kasus seperti itu di mana Anda lebih suka mendapatkan data dalam larik. Jadi, hal pertama yang perlu Anda lakukan adalah membuat formulir.Ini hanya akan menyetel nilai awal semua kotak centang menjadi
false
.Selanjutnya, kita perlu mendaftarkan variabel formulir ini di template dan melakukan iterasi di atas
checkboxes
array (BUKANFormArray
data kotak centang tapi) untuk menampilkannya di template.Manfaatkan valueChanges yang dapat diamati
Inilah bagian yang saya tidak lihat disebutkan dalam jawaban apa pun yang diberikan di sini. Dalam situasi seperti ini, di mana kami ingin menampilkan data tersebut tetapi menyimpannya sebagai sesuatu yang lain,
valueChanges
observable sangat membantu. MenggunakanvalueChanges
, kita dapat mengamati perubahancheckboxes
dan kemudianmap
yangtrue
/false
nilai-nilai yang diterima dariFormArray
data yang diinginkan. Perhatikan bahwa ini tidak akan mengubah pemilihan kotak centang karena nilai kebenaran apa pun yang diteruskan ke kotak centang akan menandainya sebagai dicentang dan sebaliknya.Ini pada dasarnya memetakan
FormArray
nilai kecheckboxes
array asli dan mengembalikanvalue
seandainya kotak centang ditandai sebagaitrue
, jika tidak maka akan dikembalikanfalse
. DiemitEvent: false
sini penting karena menyetelFormArray
nilai tanpanya akan menyebabkanvalueChanges
terjadinya peristiwa yang membuat pengulangan tanpa akhir. Dengan menyetelemitEvent
kefalse
, kami memastikanvalueChanges
observable tidak memancarkan saat kami menyetel nilainya di sini.Filter nilai yang salah
Kita tidak dapat secara langsung memfilter
false
nilai di dalamFormArray
karena hal itu akan mengacaukan template karena terikat ke kotak centang. Jadi, solusi terbaik adalah menyaringfalse
nilai selama pengiriman. Gunakan operator penyebaran untuk melakukan ini.Ini pada dasarnya menyaring nilai-nilai palsu dari file
checkboxes
.Berhenti berlangganan valueChanges
Terakhir, jangan lupa berhenti berlangganan
valueChanges
Catatan: Ada kasus khusus di mana nilai tidak dapat disetel ke
FormArray
dalamvalueChanges
, yaitu jika nilai kotak centang disetel ke angka0
. Ini akan membuatnya tampak seperti kotak centang tidak dapat dipilih karena memilih kotak centang akan menetapkanFormControl
sebagai nomor0
(nilai palsu) dan karenanya tetap tidak dicentang. Ini akan lebih disukai untuk tidak menggunakan angka0
sebagai nilai tetapi jika diperlukan, Anda harus mengatur secara kondisional0
ke beberapa nilai yang benar, katakanlah string'0'
atau hanya polostrue
dan kemudian saat mengirimkan, ubah kembali menjadi angka0
.Contoh StackBlitz
StackBlitz juga memiliki kode ketika Anda ingin meneruskan nilai default ke kotak centang sehingga mereka ditandai sebagai dicentang di UI.
sumber
TL; DR
Ini juga mengejutkan saya untuk kadang-kadang jadi saya mencoba pendekatan FormArray dan FormGroup.
Sebagian besar waktu, daftar kotak centang diisi di server dan saya menerimanya melalui API. Tetapi terkadang Anda akan memiliki sekumpulan kotak centang statis dengan nilai yang telah Anda tentukan sebelumnya. Dengan setiap kasus penggunaan, FormArray atau FormGroup yang sesuai akan digunakan.
Demi kesederhanaan, bayangkan Anda memiliki bentuk produk buat sederhana dengan
Pertama, saya menyiapkan formulir hanya dengan nama produk formControl. Ini adalah bidang yang wajib diisi.
Karena kategori dirender secara dinamis, saya harus menambahkan data ini ke dalam formulir nanti setelah data siap.
Ada dua pendekatan untuk menyusun daftar kategori.
1. Bentuk Array
Ini
buildCategoryFormGroup
akan mengembalikan saya sebuah FormArray. Ini juga mengambil daftar nilai yang dipilih sebagai argumen jadi Jika Anda ingin menggunakan kembali formulir untuk mengedit data, ini bisa membantu. Untuk tujuan membuat bentuk produk baru, ini belum bisa diterapkan.Tercatat ketika Anda mencoba mengakses nilai formArray. Ini akan terlihat seperti
[false, true, true]
. Untuk mendapatkan daftar id yang dipilih, dibutuhkan sedikit lebih banyak pekerjaan untuk memeriksa dari daftar tetapi berdasarkan indeks array. Kedengarannya tidak bagus bagi saya, tetapi berhasil.Itulah mengapa saya datang menggunakan
FormGroup
masalah itu2. Bentuk Kelompok
Perbedaan dari formGroup adalah akan menyimpan data form sebagai objek, yang membutuhkan key dan form control. Jadi adalah ide yang bagus untuk menyetel kunci sebagai categoryId dan kemudian kita bisa mengambilnya nanti.
Nilai grup formulir akan terlihat seperti ini:
Namun paling sering kami hanya ingin mendapatkan daftar categoryIds sebagai
["category2", "category3"]
. Saya juga harus menulis untuk mengambil data ini. Saya lebih menyukai pendekatan ini dibandingkan dengan formArray, karena saya sebenarnya dapat mengambil nilai dari formulir itu sendiri.3. Validator khusus untuk memeriksa setidaknya satu kotak centang dipilih
Saya membuat validator untuk memeriksa setidaknya X kotak centang dipilih, secara default hanya akan memeriksa satu kotak centang.
sumber
Buat acara saat diklik lalu ubah nilai true secara manual ke nama yang diwakili oleh kotak centang, lalu nama atau true akan dievaluasi sama dan Anda bisa mendapatkan semua nilai alih-alih daftar true / false. Ex:
component.html
component.ts
Ini menangkap acara setelah itu sudah diubah menjadi benar atau salah oleh Bentuk Sudut, jika itu benar saya mengubah nama ke nama yang diwakili oleh kotak centang, yang jika diperlukan juga akan mengevaluasi ke benar jika itu diperiksa benar / salah sebagai baik.
sumber
Jika Anda ingin menggunakan bentuk reaktif Angular ( https://angular.io/guide/reactive-forms ).
Anda dapat menggunakan satu kontrol formulir untuk mengelola nilai yang dikeluarkan dari grup kotak centang.
komponen
html
checklistState
Mengelola model / status input daftar periksa. Model ini memungkinkan Anda untuk memetakan keadaan saat ini ke format nilai apa pun yang Anda butuhkan.
Model:
checklist
Kontrol FormulirKontrol ini menyimpan nilai yang ingin disimpan sebagai mis
keluaran nilai:
"value_1,value_2"
Lihat demo di https://stackblitz.com/edit/angular-multi-checklist
sumber
Solusi saya - memecahkannya untuk Angular 5 dengan Material View
Sambungannya melalui
Dengan cara ini dapat bekerja untuk beberapa array kotak centang dalam satu bentuk. Cukup atur nama array kontrol untuk menghubungkan setiap waktu.
Pada akhirnya Anda bisa menyimpan formulir dengan array id catatan asli untuk disimpan / diperbarui.
sumber
BAGIAN TEMPLATE: -
BAGIAN PENGONTROL: -
sumber
Tambahkan 5 sen saya) Model pertanyaan saya
template.html
component.ts
sumber
Jawaban terkait @ nash11, berikut ini cara Anda menghasilkan larik nilai kotak centang
DAN
memiliki kotak centang yang juga memilihSemua kotak centang:
https://stackblitz.com/edit/angular-checkbox-custom-value-with-selectall
sumber