Resposta curta : você realmente precisa dessa função ou pode usar propriedade? http://jsfiddle.net/awnqm/1/
Resposta longa
Para simplificar, descreverei apenas seu caso - ngRepeat para array de objetos. Além disso, omitirei alguns detalhes.
O AngularJS usa verificação suja para detectar alterações. Quando a aplicação é iniciada corre $digestpara $rootScope. $digestfará a travessia em profundidade para a hierarquia do escopo . Todos os escopos têm lista de relógios. Cada relógio tem o último valor (inicialmente initWatchVal). Para cada escopo para todos os relógios o $digestexecuta, obtém o valor atual ( watch.get(scope)) e o compara com watch.last. Se o valor atual não for igual a watch.last(sempre na primeira comparação), $digestdefina dirtycomo true. Quando todos os escopos são processados, ele dirty == true $digestinicia outro percurso em profundidade de $rootScope. $digesttermina quando sujo == falso ou número de travessias == 10. No último caso, o erro "10 $ digest () iterações alcançadas." será registrado.
Agora sobre ngRepeat. Para cada watch.getchamada, ele armazena objetos da coleção (valor de retorno de getEntities) com informações adicionais no cache ( HashQueueMappor hashKey). Para cada watch.getchamada ngRepeattenta obter o objeto por meio hashKeydo cache. Se ele não existir no cache, ngRepeatarmazena em cache, cria novo escopo, coloca objeto sobre ele, cria elemento DOM, etc .
Agora sobre hashKey. Normalmente hashKeyé um número único gerado por nextUid(). Mas pode ser função . hashKeyé armazenado no objeto após a geração para uso futuro.
Por que seu exemplo gera erro : a função getEntities()sempre retorna o array com o novo objeto. Este objeto não tem hashKeye não existe no ngRepeatcache. Assim, ngRepeatcada um watch.getgera um novo escopo para ele com um novo relógio {{entity.id}}. Este relógio primeiro watch.gettem watch.last == initWatchVal. Então watch.get() != watch.last. Então $digestcomeça uma nova travessia. Portanto, ngRepeatcria um novo escopo com o novo relógio. Então ... após 10 travessias você obtém um erro.
Como você pode consertar isso
- Não crie novos objetos em cada
getEntities()chamada.
- Se você precisa criar novos objetos, você pode adicionar
hashKeymétodos para eles. Veja este tópico para exemplos.
Espero que as pessoas que conhecem os componentes internos do AngularJS me corrijam se eu estiver errado em algo.