Angular: تغيير خطأ الكشف -> حلقة لا نهائية

تم إنشاؤها على ٢٣ سبتمبر ٢٠١٥  ·  3تعليقات  ·  مصدر: angular/angular

لقد وجدت حالة يدخل فيها اكتشاف التغيير في حلقة لا نهائية عند حدوث خطأ.

الكود المعني:

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

hours bufix

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

لقد تعقبت السبب الجذري:

يعلن NgControlGroup عن طريقة onInit ، والتي تقوم بجدولة بعض الأعمال ليتم إكمالها بشكل غير متزامن ، عبر PromiseWrapper.resolve .

تكمن المشكلة في أنه يمكن استدعاء onInit عدة مرات - يتم استدعاؤه في حالة تشغيل الكشف عن التغيير ولم يكتمل أبدًا بنجاح. إذا حدث استثناء أثناء الكشف عن التغيير بعد onInit يسمى، AbstractChangeDetector.alreadyChecked لن تكون مجموعة و onInit سوف يتم تشغيلها مرة أخرى خلال القراد المقبلة. نظرًا لأن onInit في NgControlGroup بجدولة عمل غير متزامن ، فإن العلامة التالية ستحدث على الفور ، مما يتسبب في حدوث حلقة تعطل.

ال 3 كومينتر

يبدو أن <div ng-control-group='credentials'></div> مع ng-if كافٍ لتشغيل الخطأ.

لقد تعقبت السبب الجذري:

يعلن NgControlGroup عن طريقة onInit ، والتي تقوم بجدولة بعض الأعمال ليتم إكمالها بشكل غير متزامن ، عبر PromiseWrapper.resolve .

تكمن المشكلة في أنه يمكن استدعاء onInit عدة مرات - يتم استدعاؤه في حالة تشغيل الكشف عن التغيير ولم يكتمل أبدًا بنجاح. إذا حدث استثناء أثناء الكشف عن التغيير بعد onInit يسمى، AbstractChangeDetector.alreadyChecked لن تكون مجموعة و onInit سوف يتم تشغيلها مرة أخرى خلال القراد المقبلة. نظرًا لأن onInit في NgControlGroup بجدولة عمل غير متزامن ، فإن العلامة التالية ستحدث على الفور ، مما يتسبب في حدوث حلقة تعطل.

تم قفل هذه المشكلة تلقائيًا بسبب عدم النشاط.
يرجى تقديم مشكلة جديدة إذا كنت تواجه مشكلة مشابهة أو ذات صلة.

اقرأ المزيد عن سياسة قفل المحادثة التلقائي .

_تم تنفيذ هذا الإجراء تلقائيًا بواسطة روبوت ._

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