Angular.js: Angular 1.6 يعيد تعيين ``<select>قيمة `ng-model`</select>

تم إنشاؤها على ٢٠ يناير ٢٠١٧  ·  3تعليقات  ·  مصدر: angular/angular.js

ملاحظة : لأسئلة الدعم ، يرجى استخدام إحدى هذه القنوات: https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#question.

هل تريد طلب ميزة أو الإبلاغ عن خطأ ؟
حشرة

ما هو السلوك الحالي؟
Angular 1.6 يعيد تعيين <select> s ng-model عندما تتغير القائمة <option> s (راجع قسم "معلومات أخرى").
Angular 1.5 يحافظ عليها.

إذا كان السلوك الحالي عبارة عن خطأ ، فالرجاء تقديم خطوات إعادة إنتاج وإذا أمكن عرضًا توضيحيًا بسيطًا للمشكلة عبر https://plnkr.co أو ما شابه (نموذج: http://plnkr.co/edit/tpl:yBpEi4) .
الزاوي 1.6: https://plnkr.co/edit/wHc4rzy7x9PAEqQLfVQT؟
الزاوية 1.5.11: https://plnkr.co/edit/e0LVMEtGP2j4JxNf8lsp؟

ما هو السلوك المتوقع؟
ng-model يحتفظ بقيمته.

ما هو الدافع / حالة الاستخدام لتغيير السلوك؟
انها ليست صحيحة.

ما إصدارات Angular وأي متصفح / نظام تشغيل متأثر بهذه المشكلة؟ يرجى أيضًا الاختبار باستخدام أحدث الإصدارات الثابتة واللقطات (https://code.angularjs.org/snapshot/).
الزاوي 1.6.x يتأثر.
الزاوي 1.5.x ليس كذلك.

معلومات أخرى (مثل stacktraces والمشكلات ذات الصلة واقتراحات كيفية الإصلاح)
الشيء هو أن Angular 1.6 يتتبع الخيارات حسب طرازه وليس options s.

في المقتطفات أعلاه ، تحتوي مصفوفة الخيارات على كائنين: [{val: "1"}, {val: "2"}] .
يتكرر ng-repeat خلالها ويستخدم خاصية val كقيمة للخيار والعنوان.
vm.selected كقيمة select ng-model ويتم ضبطه مبدئيًا على "2".

بعد الضغط على الزر Change options ، استبدل مجموعة الخيارات بهذه المجموعة: [{val: "2"}, {val: "3"}] و Angular 1.6 يعيد تعيين vm.selected لكن لا يجب أن يكون ذلك لأن الخيار ذو القيمة 2 هو لا يزال في القائمة.

الزاوية 1.5 تتصرف بشكل صحيح في هذه الحالة ويتم الاحتفاظ بقيمة vm.selected .

إذا كان vm.options يحتوي على قيم أولية ، فلا يظهر الخطأ ( مقتطف ).

forms low investigation regression bug

التعليق الأكثر فائدة

يبدو أن هذا كان تغييرًا مقصودًا في https://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84 : "- عند إزالة خيار محدد حاليًا أو تغيير قيمته ، يتم تعيين النموذج على قيمة خالية. " لكن هذا لم يأخذ في الاعتبار أن هذا قد يكون معطلاً ، أو أن ngRepeat سيأخذ ملخصًا لتحديث الخيارات. من الأسهل أيضًا القيام بذلك في ngOptions لأننا نتحكم في إنشاء / تدمير العناصر.
لكن ScheduleRender () يعمل ، رائع لـ

ال 3 كومينتر

يبدو أنه مشكلة صالحة وتكسر في 1.6.0-rc.0. لست متأكدًا من سبب عدم حدوث ذلك من قبل ، ولكن يبدو أن المشكلة هي:

  1. عندما يتغير مجموعة، ngRepeat يزيل السابقة <option> العناصر.
  2. يؤدي هذا إلى إلغاء تحديد <select> وتعيين ngModel على قيمة خالية.
  3. يتم إنشاء العناصر الجديدة وإدراجها بواسطة ngRepeat ، لكن قيمة النموذج لم تعد 2 ، لذا فإن <select> ليس لديه طريقة لربطه بـ <option value="2" ...> .

الحل البديل هو استخدام track by لتجنب تدمير وإعادة إنشاء عناصر <option> :

<option ng-repeat="option in options track by option.val" value="option.val">...

#

من نظرة سريعة ، الالتزامات التالية مرشحة للتسبب في هذا (ولكن قد يكون شيئًا آخر):

  • f02b707
  • 47c15fb
  • 2785ad7

#

من أعلى رأسي ، سأبدأ باستبدال هذا الخط بـ scheduleRender() ومعرفة ما إذا كان يساعد ...

أنا متأكد من أن Narretz سيكون لديه بعض الأفكار الأفضل: مبتسم:

الحل البديل هو استخدام track by لتجنب تدمير وإعادة إنشاء

نعم ، اكتشفها أيضًا ولكن نسيت أن أذكر

يبدو أن هذا كان تغييرًا مقصودًا في https://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84 : "- عند إزالة خيار محدد حاليًا أو تغيير قيمته ، يتم تعيين النموذج على قيمة خالية. " لكن هذا لم يأخذ في الاعتبار أن هذا قد يكون معطلاً ، أو أن ngRepeat سيأخذ ملخصًا لتحديث الخيارات. من الأسهل أيضًا القيام بذلك في ngOptions لأننا نتحكم في إنشاء / تدمير العناصر.
لكن ScheduleRender () يعمل ، رائع لـ

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات