Saya punya tabel yang dibuat menggunakan ng-repeat. Saya ingin menambahkan validasi ke setiap elemen dalam tabel. Masalahnya adalah bahwa setiap sel input memiliki nama yang sama dengan sel di atas dan di bawahnya. Saya mencoba menggunakan {{$index}}
nilai untuk memberi nama input, tetapi meskipun string literal dalam HTML tampak benar, itu sekarang berfungsi.
Ini kode saya mulai sekarang:
<tr ng-repeat="r in model.BSM ">
<td>
<input ng-model="r.QTY" class="span1" name="QTY{{$index}}" ng-pattern="/^[\d]*\.?[\d]*$/" required/>
<span class="alert-error" ng-show="form.QTY{{$index}}.$error.pattern"><strong>Requires a number.</strong></span>
<span class="alert-error" ng-show="form.QTY{{$index}}.$error.required"><strong>*Required</strong></span>
</td>
</tr>
Saya telah mencoba menghapus {{}}
indeks dari, tetapi itu tidak berhasil. Sampai sekarang, properti validasi input bekerja dengan benar, tetapi pesan kesalahan tidak ditampilkan.
Apakah ada yang mempunyai saran?
Sunting: Selain jawaban hebat di bawah ini, berikut adalah artikel blog yang membahas masalah ini secara lebih rinci: http://www.thebhwgroup.com/blog/2014/08/angularjs-html-form-design-part-2 /
sumber
Jawaban:
AngularJS bergantung pada nama input untuk mengekspos kesalahan validasi.
Sayangnya, pada hari ini, tidak mungkin (tanpa menggunakan arahan khusus) untuk menghasilkan nama input secara dinamis. Memang, memeriksa dokumen input kita dapat melihat bahwa atribut nama hanya menerima string.
Untuk mengatasi masalah 'nama dinamis' Anda perlu membuat formulir dalam (lihat bentuk-ng ) :
Alternatif lain adalah menulis arahan khusus untuk ini.
Berikut adalah jsFiddle yang menunjukkan penggunaan ngForm: http://jsfiddle.net/pkozlowski_opensource/XK2ZT/2/
sumber
ng-form
elemen DOM, jadi tautan ke pertanyaan SO lainnya tidak relevan di sini.ng-repeat
terikattable tr
maka Anda harus menggunakanng-form="myname"
attr.Sejak pertanyaan diajukan, tim Angular telah menyelesaikan masalah ini dengan memungkinkan untuk membuat nama input secara dinamis.
Dengan Angular versi 1.3 dan yang lebih baru, Anda sekarang dapat melakukan ini:
Demo
Angular 1.3 juga memperkenalkan ngMessages, alat yang lebih kuat untuk validasi formulir. Anda dapat menggunakan teknik yang sama dengan ngMessages:
sumber
$valid
properti untuk input salahfalse
Jika Anda tidak ingin menggunakan ng-form, Anda bisa menggunakan arahan khusus yang akan mengubah atribut nama form. Tempatkan direktif ini sebagai atribut pada elemen yang sama dengan ng-model Anda.
Jika Anda menggunakan arahan lain dalam hubungannya, berhati-hatilah karena mereka tidak memiliki set properti "terminal" jika tidak, fungsi ini tidak akan dapat dijalankan (mengingat bahwa ia memiliki prioritas -1).
Misalnya, ketika menggunakan arahan ini dengan opsi-ng, Anda harus menjalankan monkeypatch satu baris ini: https://github.com/AlJohri/bower-angular/commit/eb17a967b7973eb7fc1124b024aa8b3ca540a155
Saya sering merasa berguna menggunakan ng-init untuk mengatur indeks $ ke nama variabel. Sebagai contoh:
Ini mengubah ekspresi reguler Anda menjadi:
Jika Anda memiliki beberapa pengulangan ng yang bersarang, Anda sekarang dapat menggunakan nama variabel ini sebagai ganti $ parent. $ Index.
Definisi "terminal" dan "prioritas" untuk arahan: https://docs.angularjs.org/api/ng/service/ $ compile # directive-definition-object
Github Komentar mengenai perlunya monkeypatch opsi: https://github.com/angular/angular.js/commit/9ee2cdff44e7d496774b340de816344126c457b3#commitcomment-6832095 https://twitter.com/aljohri/status/4829635415314
MEMPERBARUI:
Anda juga dapat membuat ini bekerja dengan ng-form.
sumber
Gunakan arahan ng-form di dalam tag di mana Anda menggunakan arahan ng-repeat. Anda kemudian dapat menggunakan lingkup yang dibuat oleh direktif form-ng untuk referensi nama generik. Sebagai contoh:
Kredit untuk: http://www.benlesh.com/2013/03/angular-js-validating-form-elements-in.html
sumber
ng-form="formName"
ke tag yang ng-repeat ... itu bekerja seperti pesona :)Menambahkan contoh yang lebih kompleks dengan "validasi khusus" di sisi controller http://jsfiddle.net/82PX4/3/
sumber
Melihat solusi ini, yang disediakan oleh Al Johri di atas adalah yang paling dekat dengan kebutuhan saya, tetapi arahannya sedikit kurang terprogram daripada yang saya inginkan. Ini adalah versi solusinya:
Solusi ini memungkinkan Anda hanya meneruskan ekspresi generator nama ke arahan dan menghindari kunci ke substitusi pola yang ia gunakan.
Saya juga memiliki masalah pada awalnya dengan solusi ini karena tidak menunjukkan contoh menggunakannya dalam markup, jadi di sini adalah bagaimana saya menggunakannya.
Saya punya contoh kerja yang lebih lengkap tentang github .
sumber
validasi bekerja dengan ng repeat jika saya menggunakan sintaks berikut
scope.step3Form['item[107][quantity]'].$touched
saya tidak tahu itu praktik terbaik atau solusi terbaik, tetapi ia bekerjasumber
Membangun jawaban pkozlowski.opensource , saya telah menambahkan cara untuk memiliki nama input dinamis yang juga berfungsi dengan ngMessages . Perhatikan
ng-init
bagian padang-form
elemen dan penggunaanfurryName
.furryName
menjadi nama variabel yang berisi nilai variabel untukinput
'sname
atribut.sumber
Sudah terlambat tetapi mungkin bisa membantu siapa saja
fromname[uniquname].$error
Kode sampel:
Lihat demo yang berfungsi di sini
sumber
Jika Anda menggunakan ng-repeat $ index berfungsi seperti ini
dan
kita harus menunjukkan pertunjukan-ng dalam pola-ng
sumber
Itu mungkin dan di sini adalah bagaimana saya melakukan hal yang sama dengan tabel input.
bungkus meja dalam bentuk seperti itu
Maka gunakan saja ini
Saya memiliki formulir dengan arahan multi-nested yang semuanya berisi input, pilih, dll. Elemen-elemen ini semuanya tertutup dalam pengulangan-ng, dan nilai string dinamis.
Ini adalah bagaimana menggunakan arahan:
Catatan: Anda dapat menambahkan dan mengindeks ke rangkaian string jika Anda perlu membuat serial mungkin sebuah tabel input; itulah yang saya lakukan.
Ini harus menangani banyak situasi di mana Anda tidak tahu di mana formulir itu berada. Atau mungkin Anda memiliki formulir bersarang, tetapi karena alasan tertentu Anda ingin melampirkan nama input ini ke dua formulir? Nah, cukup masukkan nama formulir yang ingin Anda lampirkan nama input.
Apa yang saya inginkan, adalah cara untuk menetapkan nilai dinamis ke input yang tidak akan pernah saya ketahui, dan kemudian panggil $ scope.myFormName. $ Valid.
Anda dapat menambahkan apa pun yang Anda inginkan: lebih banyak tabel input formulir, formulir bersarang, apa pun yang Anda inginkan. Cukup berikan nama formulir yang Anda inginkan untuk memvalidasi input. Kemudian pada form kirim tanyakan apakah $ scope.yourFormName. $ Valid
sumber
Ini akan mendapatkan nama di ng-repeat untuk muncul terpisah dalam validasi formulir.
Tetapi saya mengalami kesulitan untuk melihatnya dalam pesan validasinya jadi saya harus menggunakan ng-init untuk mendapatkannya untuk menyelesaikan variabel sebagai kunci objek.
sumber
Berikut ini contoh bagaimana saya melakukan itu, saya tidak tahu apakah itu solusi terbaik, tetapi bekerja dengan sempurna.
Pertama, kode dalam HTML. Lihatlah ng-class, itu memanggil fungsi hasError. Lihat juga pada deklarasi nama input. Saya menggunakan indeks $ untuk membuat nama input yang berbeda.
Dan sekarang, inilah fungsi hasError:
sumber
Persyaratan saya sedikit berbeda dari yang ditanyakan pada pertanyaan awal, tapi semoga saya dapat membantu seseorang yang mengalami masalah yang sama dengan saya.
Saya harus mendefinisikan apakah suatu bidang diperlukan atau tidak berdasarkan pada variabel lingkup .. Jadi pada dasarnya saya harus menetapkan
ng-required="myScopeVariable"
(yang merupakan variabel boolean).sumber