Saya ingin mengikat elemen pilih ke daftar objek - yang cukup mudah:
@Component({
selector: 'myApp',
template: `<h1>My Application</h1>
<select [(ngModel)]="selectedValue">
<option *ngFor="#c of countries" value="c.id">{{c.name}}</option>
</select>`
})
export class AppComponent{
countries = [
{id: 1, name: "United States"},
{id: 2, name: "Australia"}
{id: 3, name: "Canada"},
{id: 4, name: "Brazil"},
{id: 5, name: "England"}
];
selectedValue = null;
}
Dalam hal ini, tampaknya itu selectedValue
akan menjadi nomor - id dari item yang dipilih.
Namun, saya sebenarnya ingin mengikat objek negara itu sendiri sehingga selectedValue
objeknya bukan hanya id. Saya mencoba mengubah nilai opsi seperti:
<option *ngFor="#c of countries" value="c">{{c.name}}</option>
tapi ini sepertinya tidak berhasil. Tampaknya menempatkan objek di saya selectedValue
- tetapi bukan objek yang saya harapkan. Anda dapat melihat ini dalam contoh Plunker saya .
Saya juga mencoba mengikat ke acara perubahan sehingga saya bisa mengatur sendiri objek berdasarkan id yang dipilih; Namun, tampaknya acara perubahan diaktifkan sebelum ngModel terikat diperbarui - artinya saya tidak memiliki akses ke nilai yang baru dipilih pada saat itu.
Apakah ada cara bersih untuk mengikat elemen pilih ke objek dengan Angular 2?
Jawaban:
Contoh StackBlitz
CATATAN: Anda dapat menggunakan
[ngValue]="c"
alih-alih di[ngValue]="c.id"
mana c adalah objek negara yang lengkap.[value]="..."
hanya mendukung nilai string yang[ngValue]="..."
mendukung tipe apa punmemperbarui
Jika
value
objek, instance yang dipilih harus identik dengan salah satu nilai.Lihat juga perbandingan ubahsuaian yang baru ditambahkan https://github.com/angular/angular/issues/13268 tersedia sejak 4.0.0-beta.7
Berhati-hatilah jika Anda ingin mengakses di
this
dalamcompareFn
.sumber
selectedValue
daripada untukc
(item default). Objek yang berbeda bahkan dengan properti dan nilai yang sama tidak berfungsi, itu harus berupa instance objek yang sama.Ini bisa membantu:
sumber
let
sebagai ganti#
@ sea-kgAnda dapat melakukan ini juga tanpa perlu menggunakan tag
[(ngModel)]
Anda<select>
Deklarasikan variabel dalam file ts Anda
toStr = JSON.stringify;
dan dalam template Anda lakukan ini
dan kemudian gunakan
untuk mengurai string kembali ke objek JavaScript yang valid
sumber
Ini bekerja untuk saya:
HTML templat:
Saya menambahkan
(ngModelChange)="selectChange($event)"
keselect
.Pada component.ts:
Anda perlu menambahkan ke
component.ts
fungsi ini:Catatan: Saya mencoba
[select]="oneOption.id==model.myListOptions.id"
dan tidak bekerja.============= Cara lain dapat: =========
HTML templat:
Saya menambahkan
[compareWith]="compareByOptionId
keselect
.Pada component.ts:
Anda perlu menambahkan ke
component.ts
fungsi ini:sumber
[ngModel]
dan kemudian mengatur model Anda secara manual di custom callback perubahan yang ditentukan dalam(ngModelChange)
.Untuk berjaga-jaga jika seseorang ingin melakukan hal yang sama menggunakan Formulir Reaktif:
Lihat contoh kerja di sini
sumber
Anda Dapat Memilih Id menggunakan Fungsi
sumber
Bagi saya ini berfungsi seperti ini, Anda dapat menghibur
event.target.value
.sumber
Juga, jika tidak ada hal lain dari solusi yang diberikan tidak berfungsi, periksa apakah Anda mengimpor "FormsModule" di dalam "AppModule", itu adalah kunci bagi saya.
sumber
Buat pengambil lain untuk item yang dipilih
Dalam ts:
sumber
Anda bisa mendapatkan nilai yang dipilih juga dengan bantuan klik () dengan melewatkan nilai yang dipilih melalui fungsi
sumber
gunakan cara ini juga ..
sumber
Dalam
app.component.html
:Dan
app.component.ts
:sumber
pendekatan itu akan selalu berhasil, namun Jika Anda memiliki daftar dinamis, pastikan Anda memuatnya sebelum model
sumber