Catatan : untuk pertanyaan dukungan, gunakan salah satu saluran berikut: https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#question.
Apakah Anda ingin meminta fitur atau melaporkan bug ?
Bug
Bagaimana perilaku saat ini?
Angular 1.6 menyetel ulang <select>
s ng-model
nilai ketika daftar <option>
s berubah (lihat bagian "Informasi lain").
Angular 1.5 mempertahankannya.
Jika perilaku saat ini adalah bug, berikan langkah-langkah untuk mereproduksi dan jika mungkin demo minimal masalah tersebut melalui https://plnkr.co atau yang serupa (template: http://plnkr.co/edit/tpl:yBpEi4) .
Angular 1.6: https://plnkr.co/edit/wHc4rzy7x9PAEqQLfVQT?p=preview
Angular 1.5.11: https://plnkr.co/edit/e0LVMEtGP2j4JxNf8lsp?p=preview
Apa perilaku yang diharapkan?
ng-model
mempertahankan nilainya.
Apa motivasi / kasus penggunaan untuk mengubah perilaku?
Itu tidak benar.
Versi Angular mana, dan browser / OS mana yang terpengaruh oleh masalah ini? Silakan juga uji dengan versi stabil dan snapshot terbaru (https://code.angularjs.org/snapshot/).
Angular 1.6.x terpengaruh.
Angular 1.5.x tidak.
Informasi lain (misalnya stacktraces, masalah terkait, saran cara memperbaikinya)
Masalahnya adalah opsi trek Angular 1.6 berdasarkan modelnya dan bukan dengan nilai options
s.
Dalam potongan pilihan di atas array berisi 2 objek: [{val: "1"}, {val: "2"}]
.
ng-repeat
mengulanginya dan menggunakan properti val
sebagai nilai opsi dan judul.
vm.selected
digunakan sebagai nilai pilihan ng-model
dan awalnya disetel ke "2".
Setelah menekan tombol Change options
saya mengganti array opsi dengan yang ini: [{val: "2"}, {val: "3"}]
dan Angular 1.6 mereset vm.selected
tetapi seharusnya tidak karena opsi dengan nilai 2
adalah masih dalam daftar.
Angular 1.5 berperilaku benar dalam kasus ini dan nilai vm.selected
dipertahankan.
Jika vm.options
berisi nilai primitif, bug tidak muncul ( potongan ).
Sepertinya masalah yang valid dan rusak di 1.6.0-rc.0. Tidak yakin mengapa hal itu tidak terjadi sebelumnya, tetapi masalahnya tampaknya seperti ini:
ngRepeat
menghapus elemen <option>
.<select>
tidak dipilih dan ngModel
disetel ke null.ngRepeat
, tetapi modelValue bukan 2
lagi, jadi <select>
tidak bisa diasosiasikan dengan <option value="2" ...>
.Solusinya adalah menggunakan track by
untuk menghindari kerusakan dan pembuatan ulang elemen <option>
:
<option ng-repeat="option in options track by option.val" value="option.val">...
dari pandangan sekilas, komit berikut adalah kandidat yang menyebabkan ini (tetapi bisa jadi hal lain):
Di luar kepalaku, saya akan mulai dengan mengganti baris ini dengan scheduleRender()
dan melihat apakah itu membantu ...
Saya yakin @Narretz akan memiliki wawasan yang lebih baik: smiley:
Solusinya adalah dengan menggunakan track by untuk menghindari kerusakan dan pembuatan ulang file
Ya, ketemu juga tapi lupa 😏
Sepertinya ini adalah perubahan yang disengaja di https://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84 : "- saat opsi yang saat ini dipilih, dihapus atau nilainya berubah, model disetel ke null. " tetapi ini tidak memperhitungkan bahwa ini mungkin rusak, atau bahwa ngRepeat akan mengambil intisari untuk memperbarui opsi. Ini juga lebih mudah dilakukan dalam ngOptions karena kami mengontrol pembuatan / penghancuran elemen.
Tapi scheduleRender () berfungsi, yay untuk @gkalpak ! Saya akan melihat apakah itu merusak tes dan menyiapkan PR.
Komentar yang paling membantu
Sepertinya ini adalah perubahan yang disengaja di https://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84 : "- saat opsi yang saat ini dipilih, dihapus atau nilainya berubah, model disetel ke null. " tetapi ini tidak memperhitungkan bahwa ini mungkin rusak, atau bahwa ngRepeat akan mengambil intisari untuk memperbarui opsi. Ini juga lebih mudah dilakukan dalam ngOptions karena kami mengontrol pembuatan / penghancuran elemen.
Tapi scheduleRender () berfungsi, yay untuk @gkalpak ! Saya akan melihat apakah itu merusak tes dan menyiapkan PR.