Les réponses qui ont été données jusqu'ici ne fonctionnera que la première fois que l' ng-repeat
est rendu, mais si vous avez une dynamique ng-repeat
, ce qui signifie que vous allez à ajouter/supprimer/filtrage des éléments, et vous devez être notifié à chaque fois que l' ng-repeat
est rendu, ces solutions ne fonctionnent pas pour vous.
Donc, si vous avez besoin d'être informé CHAQUE FOIS que l' ng-repeat
obtient un nouveau rendu , et pas seulement la première fois, j'ai trouvé un moyen de le faire, c'est tout à fait "hacky", mais il fonctionnera bien si vous savez ce que vous faites. Utilisez cette $filter
votre ng-repeat
avant d'utiliser tout autre $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;
};
})
Ce sera $emit
un événement appelé ngRepeatFinished
chaque fois que l' ng-repeat
est rendu.
Comment l'utiliser:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
L' ngRepeatFinish
filtre doit être appliqué directement à un Array
ou Object
défini dans votre $scope
, vous pouvez appliquer d'autres filtres après.
Comment ne PAS l'utiliser:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
Ne pas appliquer d'autres filtres d'abord et ensuite appliquer l' ngRepeatFinish
filtre.
Quand devrais-je utiliser?
Si vous souhaitez appliquer des styles css dans le DOM après la liste a fini de rendre, parce que vous devez avoir en compte les nouvelles dimensions des éléments du DOM qui ont été rendus par l' ng-repeat
. (BTW: ces opérations doivent être effectuées à l'intérieur d'une directive)
Quoi NE PAS faire dans la fonction qui gère l' ngRepeatFinished
événement:
Ne pas effectuer l' $scope.$apply
dans cette fonction ou de vous mettre Angulaire dans une boucle sans fin qui Angulaire de ne pas être en mesure de détecter.
Ne pas l'utiliser pour faire des changements dans la $scope
propriétés, car ces modifications ne seront pas prises en compte dans votre vue jusqu'à la prochaine $digest
boucle, et puisque vous ne pouvez pas effectuer de $scope.$apply
ils ne seront pas de toute utilisation.
"Mais les filtres ne sont pas destinés à être utilisés comme ca!!!!"
Non, ils ne le sont pas, c'est un hack, si vous ne l'aimez pas, ne l'utilisez pas. Si vous connaissez un meilleur moyen pour accomplir la même chose s'il vous plaît laissez-moi savoir.
Résumant
C'est un hack, et de l'aide dans le mauvais sens est dangereux de l'utiliser uniquement pour l'application de styles après l' ng-repeat
a fini de rendre et vous ne devriez pas avoir de problèmes.