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 .
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._
Komentar yang paling membantu
Saya melacak akar penyebabnya:
NgControlGroup
mendeklarasikan metodeonInit
, yang menjadwalkan beberapa pekerjaan untuk diselesaikan secara asinkron, melaluiPromiseWrapper.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 setelahonInit
dipanggil,AbstractChangeDetector.alreadyChecked
tidak akan disetel danonInit
akan dijalankan lagi selama centang berikutnya. KarenaonInit
diNgControlGroup
menjadwalkan pekerjaan asinkron, centang berikutnya akan segera terjadi, menyebabkan crash loop.