Las respuestas que se han dado hasta ahora solo funcionarán la primera vez que ng-repeatse procese , pero si tiene una dinámica ng-repeat, lo que significa que va a agregar / eliminar / filtrar elementos, y debe ser notificado cada vez que ng-repeatse procesa, esas soluciones no funcionarán para usted.
Entonces, si necesita que le notifiquen CADA VEZ que ng-repeatse vuelve a reproducir y no solo la primera vez, he encontrado una manera de hacerlo, es bastante 'hacky', pero funcionará bien si sabe lo que es haciendo. Use esto $filteren su ng-repeat antes de usar cualquier otro$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;
};
})
Este será $emitun evento llamado ngRepeatFinishedcada vez que ng-repeatse procesa.
Cómo usarlo:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
El ngRepeatFinishfiltro debe aplicarse directamente a uno Arrayo un Objectdefinido en su $scope, puede aplicar otros filtros después.
Cómo NO usarlo:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
No aplique otros filtros primero y luego aplique el ngRepeatFinishfiltro.
¿Cuándo debo usar esto?
Si desea aplicar ciertos estilos CSS en el DOM después de que la lista haya terminado de renderizarse, porque debe tener en cuenta las nuevas dimensiones de los elementos DOM que han sido reproducidos por el ng-repeat. (Por cierto: ese tipo de operaciones deben realizarse dentro de una directiva)
Qué NO HACER en la función que maneja el ngRepeatFinishedevento:
No realice una $scope.$applyfunción en esa función o colocará Angular en un bucle sin fin que Angular no podrá detectar.
No lo use para hacer cambios en las $scopepropiedades, porque esos cambios no se reflejarán en su vista hasta el próximo $digestciclo, y dado que no puede realizar una $scope.$apply, no serán de ninguna utilidad.
"¡¡Pero los filtros no están destinados a usarse así !!"
No, no lo son, esto es un truco, si no te gusta, no lo uses. Si conoce una mejor manera de lograr lo mismo, hágamelo saber.
Resumiendo
Este es un truco , y usarlo de manera incorrecta es peligroso, úselo solo para aplicar estilos después de que ng-repeathaya finalizado el renderizado y no debería tener ningún problema.
element.ready()fragmento? Quiero decir ... ¿es algún tipo de complemento jQuery que tienes, o debería activarse cuando el elemento está listo?