Odpowiedzi, które zostały podane do tej pory, zadziałają tylko przy pierwszym ng-repeat
renderowaniu , 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-repeat
zostanie renderowany, te rozwiązania nie będą działać.
Tak więc, jeśli chcesz być powiadamiany za każdym razem, że ng-repeat
wystą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 $filter
w 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 $emit
to wydarzenie wywoływane za ngRepeatFinished
każdym razem, gdy ng-repeat
zostanie zrenderowany.
Jak tego użyć:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
ngRepeatFinish
Potrzebuje filtra należy stosować bezpośrednio na Array
lub Object
zdefiniowanych 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 ngRepeatFinish
filtr.
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 ngRepeatFinished
zdarzenie:
Nie wykonuj $scope.$apply
w 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 $scope
właściwościach, ponieważ zmiany te nie zostaną odzwierciedlone w widoku do następnej $digest
pętli, a ponieważ nie można ich wykonać, $scope.$apply
nie 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-repeat
zakoń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?