Angular: 変更検出エラー->無限ループ

作成日 2015年09月23日  ·  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>
  `
})

キーはng-if!d.validです。 dは定義されておらず、これにより無限ループがトリガーされます。

これは完全なプランカーの例です。

hours bufix

最も参考になるコメント

私は根本的な原因を突き止めました:

NgControlGroupPromiseWrapper.resolve介して、一部の作業が非同期で完了するようにスケジュールするonInitメソッドを宣言します。

問題は、 onInitが実際には複数回呼び出される可能性があることです。これは、変更検出が実行され、正常に完了しなかった場合に呼び出されます。 onInitが呼び出された後、変更検出中に例外が発生した場合、 AbstractChangeDetector.alreadyCheckedは設定されず、次のティック中にonInitが再度実行されます。 NgControlGroup onInitは非同期作業をスケジュールするため、その次のティックはすぐに発生し、クラッシュループが発生します。

全てのコメント3件

<div ng-control-group='credentials'></div>ng-if組み合わせで、バグを引き起こすのに十分なようです。

私は根本的な原因を突き止めました:

NgControlGroupPromiseWrapper.resolve介して、一部の作業が非同期で完了するようにスケジュールするonInitメソッドを宣言します。

問題は、 onInitが実際には複数回呼び出される可能性があることです。これは、変更検出が実行され、正常に完了しなかった場合に呼び出されます。 onInitが呼び出された後、変更検出中に例外が発生した場合、 AbstractChangeDetector.alreadyCheckedは設定されず、次のティック中にonInitが再度実行されます。 NgControlGroup onInitは非同期作業をスケジュールするため、その次のティックはすぐに発生し、クラッシュループが発生します。

この問題は、非アクティブのために自動的にロックされています。
同様の問題または関連する問題が発生した場合は、新しい問題を提出してください。

自動会話ロックポリシーの詳細をご覧ください。

_このアクションはボットによって自動的に実行されました。_

このページは役に立ちましたか?
0 / 5 - 0 評価