ملاحظة : لأسئلة الدعم ، يرجى استخدام إحدى هذه القنوات: 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
يحتوي على قيم أولية ، فلا يظهر الخطأ ( مقتطف ).
يبدو أنه مشكلة صالحة وتكسر في 1.6.0-rc.0. لست متأكدًا من سبب عدم حدوث ذلك من قبل ، ولكن يبدو أن المشكلة هي:
ngRepeat
يزيل السابقة <option>
العناصر.<select>
وتعيين ngModel
على قيمة خالية.ngRepeat
، لكن قيمة النموذج لم تعد 2
، لذا فإن <select>
ليس لديه طريقة لربطه بـ <option value="2" ...>
.الحل البديل هو استخدام track by
لتجنب تدمير وإعادة إنشاء عناصر <option>
:
<option ng-repeat="option in options track by option.val" value="option.val">...
من نظرة سريعة ، الالتزامات التالية مرشحة للتسبب في هذا (ولكن قد يكون شيئًا آخر):
من أعلى رأسي ، سأبدأ باستبدال هذا الخط بـ scheduleRender()
ومعرفة ما إذا كان يساعد ...
أنا متأكد من أن Narretz سيكون لديه بعض الأفكار الأفضل: مبتسم:
الحل البديل هو استخدام track by لتجنب تدمير وإعادة إنشاء
نعم ، اكتشفها أيضًا ولكن نسيت أن أذكر
يبدو أن هذا كان تغييرًا مقصودًا في https://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84 : "- عند إزالة خيار محدد حاليًا أو تغيير قيمته ، يتم تعيين النموذج على قيمة خالية. " لكن هذا لم يأخذ في الاعتبار أن هذا قد يكون معطلاً ، أو أن ngRepeat سيأخذ ملخصًا لتحديث الخيارات. من الأسهل أيضًا القيام بذلك في ngOptions لأننا نتحكم في إنشاء / تدمير العناصر.
لكن ScheduleRender () يعمل ، رائع لـ
التعليق الأكثر فائدة
يبدو أن هذا كان تغييرًا مقصودًا في https://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84 : "- عند إزالة خيار محدد حاليًا أو تغيير قيمته ، يتم تعيين النموذج على قيمة خالية. " لكن هذا لم يأخذ في الاعتبار أن هذا قد يكون معطلاً ، أو أن ngRepeat سيأخذ ملخصًا لتحديث الخيارات. من الأسهل أيضًا القيام بذلك في ngOptions لأننا نتحكم في إنشاء / تدمير العناصر.
لكن ScheduleRender () يعمل ، رائع لـ