Inilah yang tampaknya mengganggu banyak orang (termasuk saya).
Saat menggunakan ng-options
arahan dalam AngularJS untuk mengisi opsi untuk sebuah <select>
tag, saya tidak tahu cara mengatur nilai untuk suatu opsi. Dokumentasi untuk ini benar-benar tidak jelas - setidaknya untuk orang bodoh seperti saya.
Saya dapat mengatur teks untuk opsi dengan mudah seperti ini:
ng-options="select p.text for p in resultOptions"
Kapan resultOptions
misalnya:
[
{
"value": 1,
"text": "1st"
},
{
"value": 2,
"text": "2nd"
}
]
Seharusnya (dan mungkin) hal yang paling sederhana untuk mengatur nilai opsi, tapi sejauh ini saya tidak mengerti.
javascript
angularjs
Jukka Puranen
sumber
sumber
Jawaban:
Dalam kasus Anda, seharusnya begitu
Memperbarui
Dengan pembaruan di AngularJS, sekarang dimungkinkan untuk menetapkan nilai aktual untuk
value
atributselect
elemen dengantrack by
ekspresi.Bagaimana cara mengingat hal-hal buruk ini
Untuk semua orang yang mengalami kesulitan untuk mengingat bentuk sintaksis ini: Saya setuju ini bukan sintaksis yang paling mudah atau indah. Sintaks ini adalah jenis versi lanjutan dari pemahaman daftar Python dan pengetahuan yang membantu saya mengingat sintaks dengan sangat mudah. Ini sesuatu seperti ini:
Kode python:
Ini sebenarnya sintaks yang sama dengan yang pertama di atas. Namun, dalam
<select>
kita biasanya perlu membedakan antara nilai aktual dalam kode dan teks yang ditampilkan (label) dalam suatu<select>
elemen.Seperti, kita perlu
person.id
dalam kode, tetapi kami tidak ingin menunjukkanid
kepada pengguna; kami ingin menunjukkan namanya. Demikian juga, kami tidak tertarik padaperson.name
kode. Adaas
kata kunci untuk memberi label barang. Jadi menjadi seperti ini:Atau, alih-alih
person.id
kita bisa membutuhkanperson
instance / referensi itu sendiri. Lihat di bawah:Untuk objek JavaScript, metode yang sama juga berlaku. Ingatlah bahwa item dalam objek didekonstruksi dengan
(key, value)
berpasangan.sumber
Bagaimana atribut nilai mendapatkan nilainya:
Jadi dalam kasus Anda seharusnya:
sumber
Saya punya masalah ini juga. Saya tidak dapat menetapkan nilai saya di opsi-ng. Setiap opsi yang dihasilkan diatur dengan 0, 1, ..., n.
Untuk memperbaikinya, saya melakukan sesuatu seperti ini di opsi-ng saya:
HTML:
Saya menggunakan "track by" untuk mengatur semua nilai saya
room.price
.(Contoh ini payah: karena jika ada lebih dari satu harga yang sama, kodenya akan gagal. Jadi PASTI memiliki nilai yang berbeda.)
JSON:
Saya mempelajarinya dari posting blog Cara mengatur nilai awal yang dipilih dari elemen pilih menggunakan Angular.JS ng-opsi & melacak dengan .
Tonton videonya. Kelas yang bagus :)
sumber
Jika Anda ingin mengubah nilai
option
elemen Anda karena formulir pada akhirnya akan dikirimkan ke server, alih-alih melakukan ini,Kamu bisa melakukan ini:
Nilai yang diharapkan kemudian akan dikirim melalui formulir dengan nama yang benar.
sumber
<input type="hidden" name="text" value="{{ text }}" />
, saya akan menggunakanng-value
. Jadi:<input type="hidden" name="text" ng-value="{{ text }}" />
.Untuk mengirim nilai khusus yang dipanggil
my_hero
ke server menggunakan formulir normal, kirim:JSON:
HTML:
Server akan menerima salah satu
iron
atausuper
sebagai nilaimy_hero
.Ini mirip dengan jawaban oleh @neemzy , tetapi menentukan data terpisah untuk
value
atribut.sumber
Tampaknya
ng-options
rumit (mungkin membuat frustrasi) untuk digunakan, tetapi dalam kenyataannya kita memiliki masalah arsitektur.AngularJS berfungsi sebagai kerangka kerja MVC untuk aplikasi HTML + JavaScript yang dinamis. Sementara komponen (V) baru memang menawarkan HTML "templating," tujuan utamanya adalah untuk menghubungkan tindakan pengguna, melalui pengontrol, dengan perubahan dalam model. Oleh karena itu tingkat abstraksi yang sesuai, yang digunakan untuk bekerja di AngularJS, adalah bahwa elemen pilih menetapkan nilai dalam model ke nilai dari kueri .
ng-options
memberikanfor
kata kunci untuk menentukan apa isi dari elemen opsi yaitup.text for p in resultOptions
.ng-options
memberikanas
kata kunci untuk menentukan apa nilai disediakan untuk model seperti dalamk as v for (k,v) in objects
.Solusi yang benar adalah masalah ini kemudian bersifat arsitektur dan melibatkan refactoring HTML Anda sehingga (M) odel melakukan komunikasi server bila diperlukan (alih-alih pengguna yang mengirimkan formulir).
Jika halaman HTML MVC tidak perlu melakukan rekayasa berlebihan untuk masalah yang dihadapi: maka gunakan hanya bagian generasi HTML dari komponen (V) AngularJS yang baru. Dalam hal ini, ikuti pola yang sama yang digunakan untuk menghasilkan elemen seperti
<li />
's di bawah<ul />
' dan menempatkan ng-repeat pada elemen opsi:Sebagai kludge , kita selalu dapat memindahkan atribut nama elemen pilih ke elemen input tersembunyi:
sumber
"Note: ngOptions provides an iterator facility for the <option> element which should be used instead of ngRepeat when you want the select model to be bound to a non-string value. This is because an option element can only be bound to string values at present."
. Tidak disebutkan kinerja, hanya bahwa ngOptions adalah alternatif untuk ngRepeat.Kamu bisa melakukan ini:
- PEMBARUAN
Setelah beberapa update, pengguna frm.adiputra 's solusi jauh lebih baik. Kode:
sumber
Saya telah berjuang dengan masalah ini untuk sementara waktu hari ini. Saya membaca dokumentasi AngularJS, ini dan posting lainnya dan beberapa blog yang mereka tuju. Mereka semua membantu saya mendapatkan detail yang lebih baik, tetapi pada akhirnya ini sepertinya menjadi topik yang membingungkan. Terutama karena banyaknya nuansa sintaksis dari
ng-options
.Pada akhirnya, bagi saya, turun menjadi lebih sedikit.
Diberikan ruang lingkup yang dikonfigurasi sebagai berikut:
Ini yang saya butuhkan untuk mendapatkan hasil yang diinginkan:
Perhatikan saya tidak menggunakan
track by
. Menggunakantrack by
item yang dipilih akan selalu mengembalikan objek yang cocok dengan FirmnessID, daripada FirmnessID itu sendiri. Ini sekarang memenuhi kriteria saya, yaitu harus mengembalikan nilai numerik daripada objek, dan digunakanng-options
untuk mendapatkan peningkatan kinerja yang disediakannya dengan tidak membuat ruang lingkup baru untuk setiap opsi yang dihasilkan.Juga, saya membutuhkan kosong baris pertama, jadi saya hanya menambahkan
<option>
ke<select>
elemen.Ini adalah Plunkr yang menunjukkan pekerjaan saya.
sumber
Alih-alih menggunakan fitur 'track by' yang baru, Anda cukup melakukan ini dengan sebuah array jika Anda ingin nilainya sama dengan teks:
Perhatikan perbedaan antara sintaks standar, yang akan membuat nilai-nilai kunci dari Obyek / Array, dan karenanya 0,1,2 dll untuk sebuah array:
k as v menjadi v as v .
Saya menemukan ini hanya berdasarkan akal sehat melihat sintaks. (k, v) adalah pernyataan aktual yang membagi array / objek menjadi pasangan nilai kunci.
Dalam pernyataan 'k as v', k akan menjadi nilainya, dan v akan menjadi opsi teks yang ditampilkan kepada pengguna. Saya pikir 'track by' berantakan dan berlebihan.
sumber
Ini paling cocok untuk semua skenario menurut saya:
di mana Anda dapat menggunakan model Anda untuk mengikat data. Anda akan mendapatkan nilai karena objek akan berisi dan pemilihan default berdasarkan skenario Anda.
sumber
Ini adalah bagaimana saya menyelesaikan ini. Saya melacak pilih berdasarkan nilai dan mengatur properti item yang dipilih ke model dalam kode JavaScript saya.
vm
adalah controller saya dan Negara di controller diambil dari layanan ini{CountryId =1, Code = 'USA', CountryName='United States of America'}
.Ketika saya memilih negara lain dari dropdown yang dipilih dan memposting halaman saya dengan "Simpan", saya mendapatkan negara yang benar terikat.
sumber
The
ng-options
direktif tidak menetapkan atribut nilai pada<options>
elemen untuk array:Menggunakan
limit.value as limit.text for limit in limits
cara:Lihat pertanyaan Stack Overflow AngularJS-opsi tidak merender nilai .
sumber
sumber
Anda dapat menggunakan opsi-ng untuk mencapai ikatan tag terpilih dengan nilai dan menampilkan anggota
Saat menggunakan sumber data ini
Anda dapat menggunakan yang di bawah ini untuk mengikat tag pilih Anda dengan nilai dan nama
ini bekerja dengan baik
sumber
Jawaban yang benar untuk pertanyaan ini telah disediakan oleh pengguna frm.adiputra , karena saat ini tampaknya ini satu-satunya cara untuk secara eksplisit mengontrol atribut nilai dari elemen opsi.
Namun, saya hanya ingin menekankan bahwa "pilih" bukan kata kunci dalam konteks ini, tetapi hanya pengganti untuk ekspresi. Silakan merujuk ke daftar berikut, untuk definisi ekspresi "pilih" serta ekspresi lain yang dapat digunakan dalam arahan opsi-ng.
Penggunaan pilih seperti yang digambarkan dalam pertanyaan:
pada dasarnya salah.
Berdasarkan daftar ekspresi, sepertinya trackexpr dapat digunakan untuk menentukan nilai, ketika opsi diberikan dalam array objek, tetapi telah digunakan dengan pengelompokan saja.
Dari dokumentasi AngularJS untuk opsi-ng:
sumber
Memilih item dalam opsi-ng bisa agak rumit tergantung pada bagaimana Anda mengatur sumber data.
Setelah bergumul dengan mereka selama beberapa waktu, saya akhirnya membuat sampel dengan sumber data paling umum yang saya gunakan. Anda dapat menemukannya di sini:
http://plnkr.co/edit/fGq2PM?p=preview
Sekarang untuk membuat opsi-ng berfungsi, berikut adalah beberapa hal yang perlu dipertimbangkan:
key | label
. Banyak contoh online menempatkan objek sebagai 'kunci', dan jika Anda memerlukan informasi dari objek atur seperti itu, gunakan properti spesifik yang Anda perlukan sebagai kunci. (ID, KODE, dll. Seperti dalam sampel Plckr)Cara untuk mengatur nilai kontrol dropdown / pilih tergantung pada # 3,
$scope.dropdownmodel = $scope.user.state;
Jika Anda menetapkan objek sebagai kunci, Anda perlu mengulang melalui opsi, bahkan menetapkan objek tidak akan mengatur item yang dipilih karena mereka akan memiliki hashke berbeda, misalnya:
Anda dapat mengganti Nilai yang disimpan untuk properti yang sama di objek lain
$scope.myObject.myProperty
,.sumber
Bagi saya jawabannya oleh Bruno Gomes adalah jawaban terbaik.
Namun sebenarnya, Anda tidak perlu khawatir tentang pengaturan properti nilai opsi terpilih. AngularJS akan membereskannya. Biarkan saya jelaskan secara mendetail.
Silakan pertimbangkan biola ini
Seperti yang dapat Anda lihat di output biola, apa pun yang Anda pilih untuk opsi kotak pilih, itu adalah nilai khusus Anda, atau nilai 0, 1, 2 yang dihasilkan secara otomatis oleh AngularJS, itu tidak masalah dalam output Anda kecuali jika Anda menggunakan jQuery atau perpustakaan lain untuk mengakses nilai opsi kotak kombo pilih itu dan memanipulasi sesuai.
sumber
Setahun setelah pertanyaan, saya harus menemukan jawaban untuk pertanyaan ini karena tidak ada yang memberikan jawaban yang sebenarnya, setidaknya kepada saya.
Anda telah bertanya bagaimana memilih opsi, tetapi tidak ada yang mengatakan bahwa kedua hal ini TIDAK sama:
Jika kami memiliki opsi seperti ini:
Dan kami mencoba untuk menetapkan opsi default seperti ini:
Ini TIDAK akan berhasil, tetapi jika Anda mencoba memilih opsi seperti ini:
Itu akan BEKERJA .
Meskipun kedua objek ini memiliki sifat yang sama, AngularJS menganggapnya sebagai BERBEDA karena AngularJS membandingkan dengan referensi .
Lihatlah biola http://jsfiddle.net/qWzTb/ .
sumber
Harap gunakan trek menurut properti yang membedakan nilai dan label dalam kotak pilih.
Silakan dicoba
yang akan menetapkan label dengan teks dan nilai dengan nilai (dari array)
sumber
Untuk objek:
sumber
Itu selalu menyakitkan bagi pengembang untuk ng-opsi. Misalnya: Mendapatkan nilai yang dipilih kosong / kosong di tag pilih. Terutama ketika berhadapan dengan objek JSON dalam opsi-ng, itu menjadi lebih membosankan. Di sini saya telah melakukan beberapa latihan tentang itu.
Tujuan: Iterate array objek JSON melalui ng-option dan atur elemen pertama yang dipilih.
Data:
Pada tag pilih saya harus menunjukkan xyz dan abc, di mana xyz harus dipilih tanpa banyak usaha.
HTML:
Dengan contoh kode di atas, Anda mungkin keluar dari berlebihan ini.
Referensi lain :
sumber
Tutorial ANGULAR.JS: NG-SELECT AND NG-OPTIONS membantu saya memecahkan masalah:
sumber
sumber
Jalankan cuplikan kode dan lihat variasinya. Ini catatan untuk pemahaman cepat
Contoh 1 (Pemilihan objek): -
ng-option="os.name for os in osList track by os.id"
. Initrack by os.id
penting & harus ada danos.id as
TIDAK harus ada sebelumnyaos.name
.ng-model="my_os"
harus diatur ke sebuah objek dengan kunci sebagai id sepertimy_os={id: 2}
.Contoh 2 (Pemilihan nilai): -
ng-option="os.id as os.name for os in osList"
. Di sinitrack by os.id
BUKAN ada di sana danos.id as
harus ada di sana sebelumnyaos.name
.ng-model="my_os"
harus set ke nilai sepertimy_os= 2
Cuplikan kode istirahat akan menjelaskan.
Tampilkan cuplikan kode
sumber
Seperti banyak yang katakan sebelumnya, jika saya memiliki data seperti ini:
Saya akan menggunakannya seperti:
Di Controller Anda, Anda perlu menetapkan nilai awal untuk menyingkirkan item kosong pertama:
sumber
Inilah cara saya mengatasi masalah ini dalam aplikasi lawas:
Dalam HTML:
Dalam JavaScript:
...
HTML saya menampilkan nilai opsi dengan benar.
sumber
Petunjuk ngOptions:
Label-1) untuk nilai dalam array:
Penjelasan Keluaran (Asumsikan item pertama dipilih):
selectedItem = {name: 'a', umur: 20} // [secara default, item yang dipilih sama dengan item nilai ]
selectedItem.age = 20
Case-2) pilih sebagai label untuk nilai dalam array:
Penjelasan Keluaran (Asumsikan item pertama dipilih): selectedItem = 20 // [pilih bagian adalah item.age ]
sumber