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.validd未定义,这会触发无限循环。

这是一个完整的 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 等级

相关问题

antonybudianto picture antonybudianto  ·  122评论

arpit-agarwal picture arpit-agarwal  ·  111评论

alan-agius4 picture alan-agius4  ·  106评论

HitomiTenshi picture HitomiTenshi  ·  139评论

ocombe picture ocombe  ·  310评论