como Ven disse, ou você está retornando objetos diferentes (não idênticos) em cada $digest
ciclo, ou está alterando os dados muitas vezes.
A solução mais rápida para descobrir qual parte do seu aplicativo está causando esse comportamento é:
- remova todos os HTML suspeitos - basicamente remova todo o seu html do modelo e verifique se não há avisos
- se não houver avisos - adicione pequenas partes do html que você removeu e verifique se o problema voltou
- repita o passo 2 até obter um aviso - você descobrirá qual parte do seu html é responsável pelo problema
- investigue mais - a parte da etapa 3 é responsável por transformar os objetos no
$scope
ou por retornar objetos não idênticos em cada $digest
ciclo.
- se você ainda tiver
$digest
avisos de iteração após a etapa 1, provavelmente está fazendo algo muito suspeito. Repita as mesmas etapas para o modelo / escopo / controlador pai
Você também quer ter certeza de não estar alterando a entrada de seus filtros personalizados
Lembre-se de que em JavaScript existem tipos específicos de objetos que não se comportam como você normalmente esperaria:
new Boolean(true) === new Boolean(true) // false
new Date(0) == new Date(0) // false
new String('a') == new String('a') // false
new Number(1) == new Number(1) // false
[] == [] // false
new Array == new Array // false
({})==({}) // false
map()
egroupBy()
certifique-se de que seus equipamentos$watch
realizem uma verificação suja,objectEquality
$watch('myFunctionDoingGropby',callback,true)
consulte docs.angularjs.org/api/ng.$rootScope.Scope#$watch$scope
que é atribuída à_.map
lista -ed uma vez - mas, no caso geral, como você influenciaria essa verificação suja por igualdade de objeto se não é um criado manualmente$watch
que está tropeçando, masngRepeat
?Normalmente isso acontece quando você retorna um objeto diferente a cada vez.
Por exemplo, se você usar isso em um
ng-repeat
:Você receberá esta mensagem de erro porque o Angular tenta ter a "estabilidade" e executará a função até retornar o mesmo resultado 2 vezes (comparando com
===
), o que em nosso caso nunca retornará verdadeiro porque a função sempre retorna um novo objeto.Neste caso, você pode corrigi-lo armazenando o objeto no escopo diretamente, por exemplo
Assim você sempre retorna o mesmo objeto!
(Você nunca deve encontrar isso, mesmo em aplicativos complexos).
Atualização: Angular adicionou algumas explicações mais detalhadas em seu site .
fonte
Só queria jogar essa solução aqui, espero que ajude outras pessoas. Eu estava tendo esse problema de iteração porque estava iterando sobre uma propriedade gerada que fazia um novo objeto toda vez que era chamada.
Corrigi-o armazenando em cache o objeto gerado na primeira vez que foi solicitado e, em seguida, sempre retornando o cache, se ele existisse. Um método dirty () também foi adicionado, o que destruiria os resultados armazenados em cache conforme necessário.
Eu tinha algo assim:
E aqui está a solução implementada:
fonte
Também existe a possibilidade de não ser um loop infinito. 10 iterações não é um número suficientemente grande para concluir isso com alguma certeza. Portanto, antes de partir para uma caçada selvagem, é aconselhável descartar essa possibilidade primeiro.
O método mais fácil de fazer isso é aumentar a contagem máxima do loop de resumo para um número muito maior, o que pode ser feito no
module.config
método, usando o$rootScopeProvider.digestTtl(limit)
método. Se oinfdig
erro não aparecer mais, você simplesmente tem alguma lógica de atualização suficientemente complexa.Se você construir dados ou visualizações com base em relógios recursivos, você pode querer procurar soluções iterativas (ou seja, não depender de novos loops de resumo para serem iniciados) usando
while
,for
ouArray.forEach
. Às vezes, a estrutura é altamente aninhada e nem mesmo recursiva, provavelmente não há muito a ser feito nesses casos, exceto aumentar o limite.Outro método de depurar o erro é examinar os dados de resumo. Se você imprimir o JSON, obterá uma série de matrizes. Cada entrada de nível superior representa uma iteração, cada iteração consiste em uma lista de entradas de observação.
Se você, por exemplo, tem uma propriedade que é modificada em
$watch
si mesma, é fácil ver que o valor está mudando infinitamente:Claro que em projetos maiores isso pode não ser tão simples, especialmente porque o
msg
campo geralmente tem o valor"fn: regularInterceptedExpression"
se o relógio for um{{ }}
interpolação.Além disso, os métodos já mencionados, como cortar o HTML para encontrar a origem do problema, são obviamente úteis.
fonte
Eu tive o mesmo problema - estava criando uma nova data toda vez. Então, para qualquer pessoa que lida com datas, converti todas as chamadas como esta:
para:
Inicializar um número em vez de um objeto de data resolveu para mim.
fonte
a maneira mais fácil é: use angular.js, não o arquivo min. abra e encontre a linha:
adicione a linha abaixo:
e, em seguida, atualize sua página, no console de ferramentas de desenvolvimento, você encontrará seu código de erro.
fonte
É um bug conhecido no
ui-router
, isso nos ajudou: https://github.com/angular-ui/ui-router/issues/600fonte
Também gostaria de mencionar que recebi essa mensagem de erro quando cometi um erro de digitação no templateUrl de uma diretiva personalizada que tinha em meu projeto. Devido ao erro de digitação, o modelo não pôde ser carregado.
Procure na guia de rede das ferramentas de desenvolvimento do seu navegador da web e veja se algum recurso está apresentando um erro 404.
Fácil de ignorar, porque a mensagem de erro é muito enigmática e aparentemente não está relacionada ao problema real.
fonte
Eu estava tendo esse problema em meu projeto porque o. Caso contrário () estava faltando na minha definição de rota e eu estava seguindo a rota errada.
fonte
Tive esse problema porque estava fazendo isso
Em vez disso: (aviso = vs ===), meu teste de unidade começou a falhar e descobri minha estupidez
fonte
Encontrei esse problema em que precisava de uma dica de ferramenta dinâmica ... fazia com que o angular o recalculasse sempre como um novo valor (embora fosse o mesmo). Eu criei uma função para armazenar em cache o valor calculado assim:
Então, no html, acessei assim:
fonte
foi assim que abordei e encontrei uma solução: verifiquei o texto, mostrou:
Watchers disparados nas últimas 5 iterações: [[{"msg": "statement === statment && functionCall ()", "newVal": [{"id": 7287, "referen ...
então se você pode ver o
essa é a instrução que gera o erro. Verifiquei a função chamada nesta mensagem, retornei (false) de todos eles apenas para determinar qual deles tem o problema. um deles estava chamando uma função que fica mudando o retorno, que é o problema.
fonte
Por mais louco que pareça, eu corrigi esse erro apenas reiniciando meu navegador quando ele apareceu de repente.
Portanto, uma solução é apenas limpar o cache do seu navegador ou tentar reiniciá-lo.
fonte