Angular.js: Angular 1.6 salah me-reset '<select>nilai `ng-model`</select>

Dibuat pada 20 Jan 2017  ·  3Komentar  ·  Sumber: angular/angular.js

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 ).

forms low investigation regression bug

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.

Semua 3 komentar

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:

  1. Ketika array berubah, ngRepeat menghapus elemen <option> .
  2. Ini menyebabkan <select> tidak dipilih dan ngModel disetel ke null.
  3. Item baru dibuat dan disisipkan oleh 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):

  • f02b707
  • 47c15fb
  • 2785ad7

#

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat