Rzeczywiście, powinieneś używać dyrektyw i nie ma żadnego zdarzenia związanego z końcem pętli ng-Repeat (ponieważ każdy element jest konstruowany indywidualnie i ma swoje własne zdarzenie). Ale a) używanie dyrektyw może być wszystkim, czego potrzebujesz, i b) istnieje kilka właściwości specyficznych dla ng-Repeat, których możesz użyć, aby zrobić zdarzenie „po zakończeniu ngRepeat”.
W szczególności, jeśli chcesz tylko stylizować / dodawać zdarzenia do całej tabeli, możesz to zrobić za pomocą dyrektywy obejmującej wszystkie elementy ngRepeat. Z drugiej strony, jeśli chcesz adresować każdy element konkretnie, możesz użyć dyrektywy w ngRepeat, i będzie ona działać na każdy element po jego utworzeniu.
Następnie, nie są $index
, $first
, $middle
i $last
właściwości można użyć do zdarzeń wyzwalających. W przypadku tego HTML:
<div ng-controller="Ctrl" my-main-directive>
<div ng-repeat="thing in things" my-repeat-directive>
thing {{thing}}
</div>
</div>
Możesz użyć takich dyrektyw:
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');
};
});
Zobacz to w akcji w tym Plunkerze . Mam nadzieję, że to pomoże!
myMainDirective
kod dopiero po zakończeniu pętli? Muszę zaktualizować pasek przewijania div rodzica.Jeśli chcesz po prostu wykonać kod na końcu pętli, oto nieco prostsza odmiana, która nie wymaga dodatkowej obsługi zdarzeń:
Zobacz demo na żywo.
źródło
Nie ma potrzeby tworzenia dyrektywy, zwłaszcza po to, aby mieć
ng-repeat
pełne wydarzenie.ng-init
robi dla ciebie magię.$last
pilnuje, żefinished
tylko zostanie zwolniony, kiedy ostatni element został renderowane do DOM.Nie zapomnij utworzyć
$scope.finished
wydarzenia.Happy Coding !!
EDYCJA: 23 października 2016 r
Jeśli chcesz również wywołać
finished
funkcję, gdy w tablicy nie ma żadnego elementu, możesz zastosować następujące obejściePo prostu dodaj powyższą linię na górze
ng-repeat
elementu. Sprawdza, czy tablica nie ma żadnej wartości, i odpowiednio wywołuje funkcję.Na przykład
źródło
Oto powtórzona dyrektywa, która wywołuje określoną funkcję, gdy jest spełniona. Odkryłem, że wywoływana funkcja musi używać $ timeout z przedziałem = 0 przed wykonaniem manipulacji DOM, takich jak inicjowanie podpowiedzi na renderowanych elementach. jsFiddle: http://jsfiddle.net/tQw6w/
W $ scope.layoutDone spróbuj skomentować linię $ timeout i odkomentować „NOT CORRECT!” wiersz, aby zobaczyć różnicę w podpowiedziach.
JS:
źródło
Oto proste podejście,
ng-init
które nie wymaga nawet niestandardowej dyrektywy. Działa to dla mnie dobrze w niektórych scenariuszach, np. Konieczności automatycznego przewijania div powtórzeń ng do konkretnego elementu podczas ładowania strony, więc funkcja przewijania musi poczekać, ażng-repeat
zakończy renderowanie w DOM, zanim będzie mógł uruchomić.Zauważ, że jest to przydatne tylko w przypadku funkcji, które musisz wywołać jeden raz po początkowym renderowaniu ng-repeat. Jeśli musisz wywołać funkcję przy każdej aktualizacji zawartości powtórzeń ng, będziesz musiał użyć jednej z pozostałych odpowiedzi w tym wątku z niestandardową dyrektywą.
źródło
Uzupełnieniem odpowiedzi Pavela jest coś bardziej czytelnego i zrozumiałego:
Jak myślisz, dlaczego jeszcze
angular.noop
tam jest ...?Zalety:
Nie musisz pisać dyrektywy dla tego ...
źródło
ng-init="$last && doSomething( )"
Może nieco prostsze podejście
ngInit
idebounce
metoda Lodasha bez potrzeby niestandardowej dyrektywy:Kontroler:
Szablon:
Aktualizacja
Istnieje jeszcze prostsze rozwiązanie AngularJS wykorzystujące operator trójskładnikowy:
Szablon:
Należy pamiętać, że ngInit wykorzystuje fazę kompilacji przed połączeniem - tzn. Wyrażenie jest wywoływane przed przetworzeniem dyrektyw potomnych. Oznacza to, że nadal może być wymagane przetwarzanie asynchroniczne.
źródło
ng-init="$last ? refresh() : false"
również działałoby. I to nawet nie wymaga Lodash.Może być również konieczne, gdy zaznaczysz
scope.$last
zmienną, aby owinąć wyzwalacz znakiemsetTimeout(someFn, 0)
. AsetTimeout 0
jest przyjętą techniką w javascript i konieczne było,directive
aby działał poprawnie.źródło
Jest to ulepszenie pomysłów wyrażonych w innych odpowiedziach w celu pokazania, jak uzyskać dostęp do właściwości ngRepeat ($ index, $ first, $ middle, $ last, $ even, $ nieparzyste) przy użyciu deklaratywnej składni i izolowania zakresu ( Google zaleca najlepszą praktykę) wraz z dyrektywą dotyczącą elementów. Zauważ różnicę podstawowy:
scope.$parent.$last
.źródło
Zrobiłem to w ten sposób.
Utwórz dyrektywę
Po dodaniu go na etykiecie, gdzie to powtórzenie ng
I gotowe z tym będą uruchamiane na końcu powtórzenia ng.
źródło
Moim rozwiązaniem było dodanie div, aby wywołać funkcję, jeśli element był ostatnim w powtórzeniu.
źródło
chciałbym dodać inną odpowiedź, ponieważ poprzednie odpowiedzi zakładają, że kod potrzebny do uruchomienia po zakończeniu ngRepeat jest kodem kątowym, który w tym przypadku wszystkie powyższe odpowiedzi dają świetne i proste rozwiązanie, niektóre bardziej ogólne niż inne, a jeśli jest to ważne etap cyklu życia, możesz spojrzeć na blogu Bena Nadela na ten temat, z wyjątkiem użycia $ parse zamiast $ eval.
ale z mojego doświadczenia wynika, że - jak twierdzi OP - zwykle uruchamia niektóre wtyczki JQuery lub metody w skompilowanym domenie DOM, co w takim przypadku uznałem, że najprostszym rozwiązaniem jest stworzenie dyrektywy z setTimeout, ponieważ funkcja setTimeout jest wypychana do końca kolejki przeglądarki jest ona zawsze tuż po tym, jak wszystko jest zrobione pod kątem, zwykle ngReapet, który jest kontynuowany po funkcji nadrzędnej postLinking
dla każdego, kto zastanawia się, czy w takim przypadku nie użyć $ timeout, powoduje to, że kolejny cykl trawienia jest całkowicie niepotrzebny
źródło
Musiałem renderować formuły za pomocą MathJax po zakończeniu powtórzeń ng, żadna z powyższych odpowiedzi nie rozwiązała mojego problemu, więc zrobiłem to jak poniżej. To nie jest fajne rozwiązanie , ale działało dla mnie ...
źródło
Znalazłem tutaj odpowiedź dobrze przećwiczoną, ale nadal trzeba było dodać opóźnienie
Utwórz następującą dyrektywę:
Dodaj go do repeatera jako atrybut, jak poniżej:
Według Radu:
Dla mnie to działa, ale wciąż muszę dodać setTimeout
źródło
Jeśli po prostu chcesz zmienić nazwę klasy, aby była renderowana inaczej, poniższy kod załatwi sprawę.
Ten kod działał dla mnie, gdy miałem podobny wymóg renderowania zakupionego przedmiotu na mojej liście zakupów czcionką koryta Strick.
źródło