Les réponses qui ont été données jusqu'à présent ne fonctionneront que la première fois que le sera ng-repeatrendu , mais si vous avez une dynamique ng-repeat, ce qui signifie que vous allez ajouter / supprimer / filtrer des éléments, et vous devez être averti chaque fois que le ng-repeatest rendu, ces solutions ne fonctionneront pas pour vous.
Donc, si vous devez être averti à CHAQUE FOIS que le ng-repeatrendu est rendu et pas seulement la première fois, j'ai trouvé un moyen de le faire, c'est assez `` hacky '', mais cela fonctionnera bien si vous savez ce que vous êtes Faire. Utilisez-le $filterdans 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;
};
})
Il s'agira d' $emitun événement appelé à ngRepeatFinishedchaque fois que le sera ng-repeatrendu.
Comment l'utiliser:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
Le ngRepeatFinishfiltre doit être appliqué directement à un Arrayou à un Objectdéfini dans votre $scope, vous pouvez ensuite appliquer d'autres filtres.
Comment NE PAS l'utiliser:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
N'appliquez pas d'autres filtres en premier, puis appliquez le ngRepeatFinishfiltre.
Quand dois-je l'utiliser?
Si vous souhaitez appliquer certains styles CSS dans le DOM une fois le rendu de la liste terminé, car vous devez prendre en compte les nouvelles dimensions des éléments DOM qui ont été restitués par le ng-repeat. (BTW: ce type d'opérations doit être effectué dans une directive)
Ce qu'il NE FAUT PAS FAIRE dans la fonction qui gère l' ngRepeatFinishedévénement:
N'effectuez pas de fonction $scope.$applydans cette fonction ou vous mettrez Angular dans une boucle sans fin qu'Angular ne pourra pas détecter.
Ne l'utilisez pas pour apporter des modifications aux $scopepropriétés, car ces modifications ne seront pas reflétées dans votre vue jusqu'à la prochaine $digestboucle, et puisque vous ne pouvez pas effectuer une, $scope.$applyelles ne seront d'aucune utilité.
"Mais les filtres ne sont pas destinés à être utilisés comme ça !!"
Non, ils ne le sont pas, c'est un hack, si vous ne l'aimez pas, ne l'utilisez pas. Si vous connaissez une meilleure façon d'accomplir la même chose, faites-le moi savoir.
Résumer
C'est un hack , et l'utiliser de la mauvaise façon est dangereux, utilisez-le uniquement pour appliquer des styles une fois le ng-repeatrendu terminé et vous ne devriez avoir aucun problème.
element.ready()extrait? Je veux dire .. est-ce une sorte de plugin jQuery que vous avez, ou devrait-il être déclenché lorsque l'élément est prêt?