لقد وجدت حالة يدخل فيها اكتشاف التغيير في حلقة لا نهائية عند حدوث خطأ.
الكود المعني:
@Component({selector: "signup-comp"})
@View({
directives: [CORE_DIRECTIVES, FORM_DIRECTIVES],
template: `
<form #f="form" (ng-submit)='onSignUp(f.value)'>
<div ng-control-group='credentials' #credentials="form">
Login <input type='text' ng-control='login'>
Password <input type='password' ng-control='password'>
</div>
<div *ng-if="!d.valid">Credentials are invalid</div>
<div ng-control-group='personal'>
Name <input type='text' ng-control='name'>
</div>
<button type='submit'>Sign Up!</button>
</form>
`
})
المفتاح هو التعبير !d.valid
ng-if
!d.valid
. لم يتم تعريف d
، وهذا يؤدي إلى تشغيل حلقة لا نهائية.
فيما يلي مثال كامل لبرنامج Plunker .
يبدو أن <div ng-control-group='credentials'></div>
مع ng-if
كافٍ لتشغيل الخطأ.
لقد تعقبت السبب الجذري:
يعلن NgControlGroup
عن طريقة onInit
، والتي تقوم بجدولة بعض الأعمال ليتم إكمالها بشكل غير متزامن ، عبر PromiseWrapper.resolve
.
تكمن المشكلة في أنه يمكن استدعاء onInit
عدة مرات - يتم استدعاؤه في حالة تشغيل الكشف عن التغيير ولم يكتمل أبدًا بنجاح. إذا حدث استثناء أثناء الكشف عن التغيير بعد onInit
يسمى، AbstractChangeDetector.alreadyChecked
لن تكون مجموعة و onInit
سوف يتم تشغيلها مرة أخرى خلال القراد المقبلة. نظرًا لأن onInit
في NgControlGroup
بجدولة عمل غير متزامن ، فإن العلامة التالية ستحدث على الفور ، مما يتسبب في حدوث حلقة تعطل.
تم قفل هذه المشكلة تلقائيًا بسبب عدم النشاط.
يرجى تقديم مشكلة جديدة إذا كنت تواجه مشكلة مشابهة أو ذات صلة.
اقرأ المزيد عن سياسة قفل المحادثة التلقائي .
_تم تنفيذ هذا الإجراء تلقائيًا بواسطة روبوت ._
التعليق الأكثر فائدة
لقد تعقبت السبب الجذري:
يعلن
NgControlGroup
عن طريقةonInit
، والتي تقوم بجدولة بعض الأعمال ليتم إكمالها بشكل غير متزامن ، عبرPromiseWrapper.resolve
.تكمن المشكلة في أنه يمكن استدعاء
onInit
عدة مرات - يتم استدعاؤه في حالة تشغيل الكشف عن التغيير ولم يكتمل أبدًا بنجاح. إذا حدث استثناء أثناء الكشف عن التغيير بعدonInit
يسمى،AbstractChangeDetector.alreadyChecked
لن تكون مجموعة وonInit
سوف يتم تشغيلها مرة أخرى خلال القراد المقبلة. نظرًا لأنonInit
فيNgControlGroup
بجدولة عمل غير متزامن ، فإن العلامة التالية ستحدث على الفور ، مما يتسبب في حدوث حلقة تعطل.