Les réponses qui ont été données jusqu'à présent ne fonctionneront que la première fois que le sera ng-repeat
rendu , 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-repeat
est rendu, ces solutions ne fonctionneront pas pour vous.
Donc, si vous devez être averti à CHAQUE FOIS que le ng-repeat
rendu 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 $filter
dans 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' $emit
un événement appelé à ngRepeatFinished
chaque fois que le sera ng-repeat
rendu.
Comment l'utiliser:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
Le ngRepeatFinish
filtre doit être appliqué directement à un Array
ou à un Object
dé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 ngRepeatFinish
filtre.
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.$apply
dans 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 $scope
propriétés, car ces modifications ne seront pas reflétées dans votre vue jusqu'à la prochaine $digest
boucle, et puisque vous ne pouvez pas effectuer une, $scope.$apply
elles 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-repeat
rendu 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?