En effet, vous devez utiliser des directives, et il n'y a aucun événement lié à la fin d'une boucle ng-Repeat (car chaque élément est construit individuellement et a son propre événement). Mais a) l'utilisation de directives peut être tout ce dont vous avez besoin et b) il existe quelques propriétés spécifiques à ng-Repeat que vous pouvez utiliser pour rendre votre événement "on ngRepeat terminé".
Plus précisément, si tout ce que vous voulez est de styliser / ajouter des événements à l'ensemble du tableau, vous pouvez le faire en utilisant une directive qui englobe tous les éléments ngRepeat. D'un autre côté, si vous souhaitez traiter spécifiquement chaque élément, vous pouvez utiliser une directive dans le ngRepeat, et elle agira sur chaque élément, après sa création.
Ensuite, il y a les $index
, $first
, $middle
et les $last
propriétés que vous pouvez utiliser à des événements de déclenchement. Donc pour ce HTML:
<div ng-controller="Ctrl" my-main-directive>
<div ng-repeat="thing in things" my-repeat-directive>
thing {{thing}}
</div>
</div>
Vous pouvez utiliser des directives comme ceci:
angular.module('myApp', [])
.directive('myRepeatDirective', function() {
return function(scope, element, attrs) {
angular.element(element).css('color','blue');
if (scope.$last){
window.alert("im the last!");
}
};
})
.directive('myMainDirective', function() {
return function(scope, element, attrs) {
angular.element(element).css('border','5px solid red');
};
});
Voyez-le en action dans ce Plunker . J'espère que ça aide!
myMainDirective
exécuter le code de seulement après la fin de la boucle? J'ai besoin de mettre à jour la barre de défilement de la division parent.Si vous voulez simplement exécuter du code à la fin de la boucle, voici une variante légèrement plus simple qui ne nécessite pas de gestion supplémentaire des événements:
Voir une démo en direct.
la source
Il n'est pas nécessaire de créer une directive, surtout pour avoir un
ng-repeat
événement complet.ng-init
fait la magie pour vous.le
$last
fait que, cefinished
ne se fera virer, lorsque le dernier élément a été rendu au DOM.N'oubliez pas de créer un
$scope.finished
événement.Codage heureux !!
EDIT: 23 oct.2016
Si vous souhaitez également appeler la
finished
fonction lorsqu'il n'y a aucun élément dans le tableau, vous pouvez utiliser la solution de contournement suivanteAjoutez simplement la ligne ci-dessus en haut de la
ng-repeat
élément. Il vérifiera si le tableau n'a aucune valeur et appellera la fonction en conséquence.Par exemple
la source
Voici une directive répétée qui appelle une fonction spécifiée lorsqu'elle est vraie. J'ai trouvé que la fonction appelée doit utiliser $ timeout avec interval = 0 avant de faire une manipulation DOM, comme l'initialisation des info-bulles sur les éléments rendus. jsFiddle: http://jsfiddle.net/tQw6w/
Dans $ scope.layoutDone, essayez de commenter la ligne $ timeout et de décommenter le "NOT CORRECT!" pour voir la différence dans les info-bulles.
JS:
la source
Voici une approche simple
ng-init
qui ne nécessite même pas de directive personnalisée. Cela a bien fonctionné pour moi dans certains scénarios, par exemple avoir besoin de faire défiler automatiquement une division d'éléments ng répétés vers un élément particulier lors du chargement de la page, de sorte que la fonction de défilement doit attendre jusqu'à ce que leng-repeat
rendu soit terminé sur le DOM avant de pouvoir se déclencher.Notez que cela n'est utile que pour les fonctions que vous devez appeler une fois après le rendu initial de la répétition ng. Si vous devez appeler une fonction chaque fois que le contenu ng-repeat est mis à jour, vous devrez utiliser l'une des autres réponses sur ce fil avec une directive personnalisée.
la source
En complément de la réponse de Pavel , quelque chose de plus lisible et facilement compréhensible serait:
Sinon, pourquoi pensez-vous
angular.noop
y a d'abord ...?Avantages:
Vous n'avez pas besoin d'écrire une directive pour cela ...
la source
ng-init="$last && doSomething( )"
Peut-être une approche un peu plus simple avec
ngInit
Lodash etdebounce
méthode sans avoir besoin de directive personnalisée:Manette:
Modèle:
Mettre à jour
Il existe une solution AngularJS pure encore plus simple utilisant l'opérateur ternaire:
Modèle:
Sachez que ngInit utilise la phase de compilation de pré-liaison - c'est-à-dire que l'expression est invoquée avant le traitement des directives enfants. Cela signifie qu'un traitement asynchrone peut encore être requis.
la source
ng-init="$last ? refresh() : false"
cela fonctionnerait aussi. Et cela ne nécessite même pas Lodash.Il peut également être nécessaire lorsque vous cochez la
scope.$last
variable d'envelopper votre déclencheur avec asetTimeout(someFn, 0)
. AsetTimeout 0
est une technique acceptée en javascript et il était impératif que madirective
fonctionne correctement.la source
Il s'agit d'une amélioration des idées exprimées dans d'autres réponses afin de montrer comment accéder aux propriétés ngRepeat ($ index, $ first, $ middle, $ last, $ even, $ odd) lors de l'utilisation de la syntaxe déclarative et de l'isolement de la portée ( Google a recommandé les meilleures pratiques) avec une directive sur les éléments. Notez la différence principale:
scope.$parent.$last
.la source
Je l'ai fait de cette façon.
Créer la directive
Après l'avoir ajouté sur l'étiquette où cette ng-répétition
Et prêt avec cela sera exécuté à la fin de la répétition ng.
la source
Ma solution était d'ajouter un div pour appeler une fonction si l'élément était le dernier d'une répétition.
la source
je voudrais ajouter une autre réponse, car les réponses précédentes supposent que le code nécessaire pour s'exécuter après la fin de ngRepeat est un code angulaire, qui dans ce cas toutes les réponses ci-dessus donnent une solution simple et excellente, certaines plus génériques que d'autres, et dans le cas où il est important de l'étape du cycle de vie de résumé, vous pouvez jeter un oeil à le blog de Ben Nadel à ce sujet, à l'exception de l'utilisation de $ parse au lieu de $ eval.
mais d'après mon expérience, comme le déclare l'OP, il exécute généralement des plugins ou des méthodes JQuery sur le DOM compilé finlandais, ce qui dans ce cas, j'ai trouvé que la solution la plus simple consiste à créer une directive avec un setTimeout, car la fonction setTimeout est poussée à la fin de la file d'attente du navigateur, c'est toujours juste après que tout soit fait en angulaire, généralement ngReapet qui continue après la fonction postLinking de ses parents
pour ceux qui se demandent que dans ce cas pourquoi ne pas utiliser $ timeout, c'est que cela provoque un autre cycle de digestion qui est complètement inutile
la source
J'ai dû rendre des formules en utilisant MathJax après la fin de ng-repeat, aucune des réponses ci-dessus n'a résolu mon problème, alors j'ai fait comme ci-dessous. Ce n'est pas une bonne solution , mais ça a marché pour moi ...
la source
J'ai trouvé une réponse ici bien pratiquée, mais il fallait quand même ajouter un délai
Créez la directive suivante:
Ajoutez-le à votre répéteur en tant qu'attribut, comme ceci:
Selon Radu:
Pour moi, cela fonctionne, mais je dois encore ajouter un setTimeout
la source
Si vous voulez simplement changer le nom de la classe pour qu'il soit rendu différemment, le code ci-dessous ferait l'affaire.
Ce code a fonctionné pour moi lorsque j'avais une exigence similaire pour rendre l'élément acheté dans ma liste d'achats en police Strick Trough.
la source