Angular: Erro de detecção de mudança -> loop infinito

Criado em 23 set. 2015  ·  3Comentários  ·  Fonte: angular/angular

Encontrei um caso em que a detecção de alterações entra em um loop infinito em um erro.

O código em questão:

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

A chave é a ng-if expression !d.valid . d não está definido e isso dispara um loop infinito.

Aqui está um exemplo completo do Plunker .

hours bufix

Comentários muito úteis

Eu rastreei a causa raiz:

NgControlGroup declara um método onInit , que agenda algum trabalho a ser concluído de forma assíncrona, por meio de PromiseWrapper.resolve .

O problema é que onInit pode, na verdade, ser chamado várias vezes - ele é chamado se a detecção de alterações for executada e nunca tiver sido concluída com êxito. Se ocorrer uma exceção durante a detecção de alteração após onInit ser chamado, AbstractChangeDetector.alreadyChecked não será definido e onInit será executado novamente durante o próximo tique. Como onInit em NgControlGroup agenda o trabalho assíncrono, o próximo tique acontecerá imediatamente, causando um loop de falha.

Todos 3 comentários

Parece que <div ng-control-group='credentials'></div> combinado com ng-if é o suficiente para acionar o bug.

Eu rastreei a causa raiz:

NgControlGroup declara um método onInit , que agenda algum trabalho a ser concluído de forma assíncrona, por meio de PromiseWrapper.resolve .

O problema é que onInit pode, na verdade, ser chamado várias vezes - ele é chamado se a detecção de alterações for executada e nunca tiver sido concluída com êxito. Se ocorrer uma exceção durante a detecção de alteração após onInit ser chamado, AbstractChangeDetector.alreadyChecked não será definido e onInit será executado novamente durante o próximo tique. Como onInit em NgControlGroup agenda o trabalho assíncrono, o próximo tique acontecerá imediatamente, causando um loop de falha.

Este problema foi bloqueado automaticamente devido à inatividade.
Registre um novo problema se você estiver encontrando um problema semelhante ou relacionado.

Leia mais sobre nossa política de bloqueio automático de conversas .

_Esta ação foi executada automaticamente por um bot._

Esta página foi útil?
0 / 5 - 0 avaliações