Las respuestas que se han dado hasta ahora solo funcionarán la primera vez que ng-repeat
se 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-repeat
se procesa, esas soluciones no funcionarán para usted.
Entonces, si necesita que le notifiquen CADA VEZ que ng-repeat
se 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 $filter
en 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á $emit
un evento llamado ngRepeatFinished
cada vez que ng-repeat
se procesa.
Cómo usarlo:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
El ngRepeatFinish
filtro debe aplicarse directamente a uno Array
o un Object
definido 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 ngRepeatFinish
filtro.
¿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 ngRepeatFinished
evento:
No realice una $scope.$apply
funció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 $scope
propiedades, porque esos cambios no se reflejarán en su vista hasta el próximo $digest
ciclo, 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-repeat
haya 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?