Angular: Ubah kesalahan deteksi -> loop tak terbatas

Dibuat pada 23 Sep 2015  ·  3Komentar  ·  Sumber: angular/angular

Saya menemukan kasus di mana deteksi perubahan memasuki loop tak terbatas pada kesalahan.

Kode yang dimaksud:

@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>
  `
})

Kuncinya adalah ekspresi !d.valid ng-if !d.valid . d tidak ditentukan, dan ini memicu infinite loop.

Berikut adalah contoh Plunker lengkap .

hours bufix

Komentar yang paling membantu

Saya melacak akar penyebabnya:

NgControlGroup mendeklarasikan metode onInit , yang menjadwalkan beberapa pekerjaan untuk diselesaikan secara asinkron, melalui PromiseWrapper.resolve .

Masalahnya adalah onInit sebenarnya dapat dipanggil beberapa kali - dipanggil jika deteksi perubahan berjalan dan tidak pernah berhasil diselesaikan. Jika pengecualian terjadi selama deteksi perubahan setelah onInit dipanggil, AbstractChangeDetector.alreadyChecked tidak akan disetel dan onInit akan dijalankan lagi selama centang berikutnya. Karena onInit di NgControlGroup menjadwalkan pekerjaan asinkron, centang berikutnya akan segera terjadi, menyebabkan crash loop.

Semua 3 komentar

Sepertinya <div ng-control-group='credentials'></div> dikombinasikan dengan ng-if sudah cukup untuk memicu bug.

Saya melacak akar penyebabnya:

NgControlGroup mendeklarasikan metode onInit , yang menjadwalkan beberapa pekerjaan untuk diselesaikan secara asinkron, melalui PromiseWrapper.resolve .

Masalahnya adalah onInit sebenarnya dapat dipanggil beberapa kali - dipanggil jika deteksi perubahan berjalan dan tidak pernah berhasil diselesaikan. Jika pengecualian terjadi selama deteksi perubahan setelah onInit dipanggil, AbstractChangeDetector.alreadyChecked tidak akan disetel dan onInit akan dijalankan lagi selama centang berikutnya. Karena onInit di NgControlGroup menjadwalkan pekerjaan asinkron, centang berikutnya akan segera terjadi, menyebabkan crash loop.

Masalah ini telah dikunci secara otomatis karena tidak ada aktivitas.
Silakan ajukan masalah baru jika Anda mengalami masalah serupa atau terkait.

Baca lebih lanjut tentang kebijakan penguncian percakapan otomatis kami.

_Tindakan ini telah dilakukan secara otomatis oleh bot._

Apakah halaman ini membantu?
0 / 5 - 0 peringkat