Mam funkcję, którą chcę wywołać po załadowaniu zawartości strony. Czytałem o $ viewContentLoaded i to nie działa dla mnie. Szukam czegoś takiego
document.addEventListener('DOMContentLoaded', function () {
//Content goes here
}, false);
Powyższe wywołanie nie działa dla mnie w kontrolerze AngularJs.
Odpowiedzi:
Zgodnie z dokumentacją $ viewContentLoaded , to powinno działać
$viewContentLoaded
jest emitowane zdarzenie, co oznacza, że aby je odebrać, potrzebujesz kontrolera nadrzędnego, takiego jakOd
MainCtrl
można posłuchać wydarzeniaSprawdź demo
źródło
ng-repeat
i kilka zagnieżdżonych dyrektyw, które będą generować HTML / zawartość na podstawie złożonych pętli i warunków. Renderowanie trwa przez jakiś czas, nawet po$viewContentLoaded
wywołaniu zdarzenia. Jak możesz upewnić się, że wszystkie elementy zostały w pełni wyrenderowane, a następnie wykonać określony kod? Jakakolwiek informacja zwrotna?Kątowy <1,6.X.
Kątowy> = 1.6.X
źródło
naprawiono - 2015.06.09
Użyj dyrektywy i
ready
metody elementu kątowego w następujący sposób:js
html
lub dla tych, którzy używają składni kontrolera jako ...
Zaletą tego jest to, że możesz mieć tak szeroki lub szczegółowy interfejs użytkownika, jak chcesz, i usuwasz logikę DOM ze swoich kontrolerów. Twierdzę, że jest to zalecany sposób Angular .
Może być konieczne nadanie priorytetu tej dyrektywie, jeśli masz inne dyrektywy działające w tym samym węźle.
źródło
elem.ready( $scope.$apply( readyFunc( $scope )));
pomysłami, dlaczego tak jest? Może nastąpiła aktualizacja do Angulara? Zresztą - to eleganckie podejście, gdyby się udało.attrs.onReady
, powinno być tym, czym jest teraz. Inną kwestią było to, że nazwałem to funky ... ... co otrzymuję za konwersję coffeescript z pamięci do JS.$timeout
; Jawnie tworzysz addt. Węzeł DOM po prostu do wykonywania logiki innej niż dom; Można jej użyć ponownie tylko wtedy, gdy ta metoda znajduje się wysoko w hierarchii $ scope, tak że dziedziczą ją zakresy potomne; po prostu myślę, że wygląda źle z perspektywy NG;$timeout(function() {})
wokółelem.ready()
. W przeciwnym razie generował$digest already in progress
błąd. Ale w każdym razie, wielkie dzięki! Walczę z tym przez ostatnią godzinę.Możesz to bezpośrednio wywołać, dodając
{{YourFunction()}}
po elemencie HTML.Oto plik
Plunker Link
.źródło
Musiałem zaimplementować tę logikę podczas obsługi wykresów Google. co zrobiłem, to że na końcu mojej definicji HTML wewnątrz kontrolera dodałem.
iw tej funkcji po prostu wywołaj swoją logikę.
źródło
Powyższa metoda zadziałała dla mnie
źródło
możesz wywołać wersję javascript zdarzenia onload w angular js. to zdarzenie ng-load można zastosować do dowolnego elementu dom, takiego jak div, span, body, iframe, img itp. Poniżej znajduje się link do dodania ng-load w istniejącym projekcie.
pobierz ng-load dla angular js
Poniżej znajduje się przykład dla elementu iframe, po załadowaniu testCallbackFunction zostanie wywołany w kontrolerze
PRZYKŁAD
JS
HTML
źródło
Jeśli otrzymujesz błąd podsumowania $ w toku, może to pomóc:
źródło
Uruchomienie po załadowaniu strony powinno być częściowo spełnione przez ustawienie detektora zdarzeń na zdarzenie ładowania okna
W środku
module.run(function()...)
angulara będziesz mieć pełny dostęp do struktury modułu i zależności.Możesz
broadcast
iemit
wydarzenia dla mostów komunikacyjnych.Na przykład:
źródło
Używałem
{{myFunction()}}
w szablonie, ale potem znalazłem inny sposób tutaj, używając$timeout
wewnątrz kontrolera. Pomyślałem, że się tym podzielę, działa świetnie dla mnie.źródło
Jeśli chcesz, aby jakiś element został całkowicie załadowany, użyj ng-init na tym elemencie.
na przykład
<div class="modal fade" id="modalFacultyInfo" role="dialog" ng-init="initModalFacultyInfo()"> ..</div>
funkcja initModalFacultyInfo () powinna istnieć w kontrolerze.
źródło
Odkryłem, że jeśli masz zagnieżdżone widoki - $ viewContentLoaded jest wyzwalane dla każdego zagnieżdżonego widoku. Stworzyłem to obejście, aby znaleźć ostateczną wersję $ viewContentLoaded. Wydaje się, że działa dobrze przy ustawianiu $ window.prerenderReady zgodnie z wymaganiami Prerender (przechodzi do .run () w głównej aplikacji.js):
źródło
źródło
Rozwiązanie, które działa dla mnie, jest następujące
Kod kontrolera jest następujący
Kod HTML jest następujący
źródło
Zwykle
setInterval
czekam na załadowanie treści. Mam nadzieję, że pomoże ci to rozwiązać ten problem.źródło
setInterval
jako rozwiązanie w 2016 roku ?