As respostas que foram dadas até agora só funcionam na primeira vez em que ng-repeat
são renderizadas , mas se você tiver uma dinâmica ng-repeat
, significa que você irá adicionar / excluir / filtrar itens e precisará ser notificado sempre que o ng-repeat
for renderizada, essas soluções não funcionarão para você.
Então, se você precisar ser notificado TODAS AS VEZES de que as imagens ng-repeat
são renderizadas novamente e não apenas a primeira vez, eu encontrei uma maneira de fazer isso, é bastante 'hacky', mas funcionará bem se você souber o que é fazendo. Use isso $filter
no seu ng-repeat
antes de usar qualquer outro$filter
:
.filter('ngRepeatFinish', function($timeout){
return function(data){
var me = this;
var flagProperty = '__finishedRendering__';
if(!data[flagProperty]){
Object.defineProperty(
data,
flagProperty,
{enumerable:false, configurable:true, writable: false, value:{}});
$timeout(function(){
delete data[flagProperty];
me.$emit('ngRepeatFinished');
},0,false);
}
return data;
};
})
Será $emit
um evento chamado ngRepeatFinished
sempre que a ng-repeat
renderização for renderizada.
Como usá-lo:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
O ngRepeatFinish
filtro precisa ser aplicado diretamente a um Array
ou a um Object
definido no seu $scope
, você pode aplicar outros filtros depois.
Como NÃO usá-lo:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
Não aplique outros filtros primeiro e depois aplique o ngRepeatFinish
filtro.
Quando devo usar isso?
Se você deseja aplicar certos estilos css no DOM após a conclusão da renderização da lista, é necessário ter em conta as novas dimensões dos elementos DOM que foram renderizados novamente pelo ng-repeat
. (BTW: esse tipo de operação deve ser realizado dentro de uma diretiva)
O que NÃO FAZER na função que lida com o ngRepeatFinished
evento:
Não execute a $scope.$apply
nessa função ou você colocará o Angular em um loop infinito que o Angular não poderá detectar.
Não use-o para fazer alterações nas $scope
propriedades, porque essas alterações não serão refletidas na sua visualização até o próximo $digest
loop e, como você não pode executar uma, $scope.$apply
elas não serão de uso algum.
"Mas os filtros não devem ser usados assim !!"
Não, eles não são, isso é um hack, se você não gostar, não use. Se você souber uma maneira melhor de realizar a mesma coisa, informe-me.
Resumindo
Isso é um truque , e usá-lo da maneira errada é perigoso, use-o apenas para aplicar estilos após a ng-repeat
conclusão da renderização e você não deve ter nenhum problema.
element.ready()
snippet? Quero dizer .. é algum tipo de plugin jQuery que você possui ou deve ser acionado quando o elemento estiver pronto?