Odpowiedzi, które zostały podane do tej pory, zadziałają tylko przy pierwszym ng-repeatrenderowaniu , ale jeśli masz dynamikę ng-repeat, co oznacza, że będziesz dodawać / usuwać / filtrować elementy i za każdym razem musisz otrzymywać powiadomienia ng-repeatzostanie renderowany, te rozwiązania nie będą działać.
Tak więc, jeśli chcesz być powiadamiany za każdym razem, że ng-repeatwystąpią ponownie wydanego właśnie po raz pierwszy i nie znalazłem sposób na to, że to dość „hacky”, ale to będzie działać dobrze, jeśli wiesz, kim jesteś robić. Użyj tego $filterw swoim, ng-repeat zanim użyjesz innego$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;
};
})
Będzie $emitto wydarzenie wywoływane za ngRepeatFinishedkażdym razem, gdy ng-repeatzostanie zrenderowany.
Jak tego użyć:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
ngRepeatFinishPotrzebuje filtra należy stosować bezpośrednio na Arraylub Objectzdefiniowanych w $scope, można zastosować inne filtry po.
Jak NIE używać:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
Nie stosuj najpierw innych filtrów, a następnie zastosuj ngRepeatFinishfiltr.
Kiedy powinienem tego użyć?
Jeśli chcesz zastosować pewne style css do DOM po zakończeniu renderowania listy, ponieważ musisz wziąć pod uwagę nowe wymiary elementów DOM, które zostały ponownie renderowane przez ng-repeat. (BTW: tego rodzaju operacje powinny być wykonywane w ramach dyrektywy)
Czego NIE ZROBIĆ w funkcji obsługującej ngRepeatFinishedzdarzenie:
Nie wykonuj $scope.$applyw tej funkcji, bo umieścisz Angulara w niekończącej się pętli, której Angular nie będzie w stanie wykryć.
Nie należy go używać do wprowadzania zmian we $scopewłaściwościach, ponieważ zmiany te nie zostaną odzwierciedlone w widoku do następnej $digestpętli, a ponieważ nie można ich wykonać, $scope.$applynie będą one przydatne.
„Ale filtrów nie należy tak używać !!”
Nie, nie są, to jest hack, jeśli ci się nie podoba, nie używaj go. Jeśli znasz lepszy sposób na osiągnięcie tego samego, daj mi znać.
Zreasumowanie
To jest włamanie , a użycie go w niewłaściwy sposób jest niebezpieczne, używaj go tylko do stosowania stylów po ng-repeatzakończeniu renderowania i nie powinieneś mieć żadnych problemów.
element.ready()fragmentu? Mam na myśli ... czy jest to jakaś wtyczka jQuery, czy masz ją uruchomić, gdy element będzie gotowy?