変化検出がエラーで無限ループに入るケースを見つけました。
問題のコード:
@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>
`
})
キーはng-if
式!d.valid
です。 d
は定義されておらず、これにより無限ループがトリガーされます。
これは完全なプランカーの例です。
<div ng-control-group='credentials'></div>
とng-if
組み合わせで、バグを引き起こすのに十分なようです。
私は根本的な原因を突き止めました:
NgControlGroup
、 PromiseWrapper.resolve
介して、一部の作業が非同期で完了するようにスケジュールするonInit
メソッドを宣言します。
問題は、 onInit
が実際には複数回呼び出される可能性があることです。これは、変更検出が実行され、正常に完了しなかった場合に呼び出されます。 onInit
が呼び出された後、変更検出中に例外が発生した場合、 AbstractChangeDetector.alreadyChecked
は設定されず、次のティック中にonInit
が再度実行されます。 NgControlGroup
onInit
は非同期作業をスケジュールするため、その次のティックはすぐに発生し、クラッシュループが発生します。
この問題は、非アクティブのために自動的にロックされています。
同様の問題または関連する問題が発生した場合は、新しい問題を提出してください。
自動会話ロックポリシーの詳細をご覧ください。
_このアクションはボットによって自動的に実行されました。_
最も参考になるコメント
私は根本的な原因を突き止めました:
NgControlGroup
、PromiseWrapper.resolve
介して、一部の作業が非同期で完了するようにスケジュールするonInit
メソッドを宣言します。問題は、
onInit
が実際には複数回呼び出される可能性があることです。これは、変更検出が実行され、正常に完了しなかった場合に呼び出されます。onInit
が呼び出された後、変更検出中に例外が発生した場合、AbstractChangeDetector.alreadyChecked
は設定されず、次のティック中にonInit
が再度実行されます。NgControlGroup
onInit
は非同期作業をスケジュールするため、その次のティックはすぐに発生し、クラッシュループが発生します。