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 .
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._
Comentários muito úteis
Eu rastreei a causa raiz:
NgControlGroup
declara um métodoonInit
, que agenda algum trabalho a ser concluído de forma assíncrona, por meio dePromiseWrapper.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ósonInit
ser chamado,AbstractChangeDetector.alreadyChecked
não será definido eonInit
será executado novamente durante o próximo tique. ComoonInit
emNgControlGroup
agenda o trabalho assíncrono, o próximo tique acontecerá imediatamente, causando um loop de falha.