Ich habe eine Funktion, die ich aufrufen möchte, nachdem der Seiteninhalt geladen wurde. Ich habe über $ viewContentLoaded gelesen und es funktioniert bei mir nicht. Ich suche so etwas wie
document.addEventListener('DOMContentLoaded', function () {
//Content goes here
}, false);
Der obige Anruf funktioniert bei AngularJs Controller nicht.
Antworten:
Laut Dokumentation von $ viewContentLoaded sollte es funktionieren
$viewContentLoaded
Ereignis wird ausgegeben, was bedeutet, dass Sie zum Empfangen dieses Ereignisses einen übergeordneten Controller wie benötigenVon können
MainCtrl
Sie das Ereignis hörenÜberprüfen Sie die Demo
quelle
ng-repeat
mehrere verschachtelte Anweisungen haben, die HTML / Inhalt basierend auf komplexen Schleifen und Bedingungen generieren. Das Rendern wird einige Zeit fortgesetzt, auch nachdem ein$viewContentLoaded
Ereignis ausgelöst wurde. Wie können Sie sicherstellen, dass alle Elemente vollständig gerendert wurden, und dann bestimmten Code ausführen? Irgendeine Anregung?Winkel <1.6.X
Winkel> = 1.6.X.
quelle
fest - 2015.06.09
Verwenden Sie eine Direktive und die Winkelelementmethode
ready
wie folgt:js
html
oder für diejenigen, die Controller-als- Syntax verwenden ...
Dies hat den Vorteil, dass Sie mit Ihrer Benutzeroberfläche so breit oder detailliert sein können, wie Sie möchten, und dass Sie die DOM-Logik von Ihren Controllern entfernen. Ich würde argumentieren, dass dies der empfohlene Winkelweg ist .
Möglicherweise müssen Sie diese Anweisung priorisieren, falls andere Anweisungen auf demselben Knoten ausgeführt werden.
quelle
elem.ready( $scope.$apply( readyFunc( $scope )));
Irgendwelche Ideen, warum das sein könnte? Vielleicht ist ein Update auf Angular passiert? Wie auch immer - es ist ein eleganter Ansatz, wenn es funktionieren könnte.attrs.onReady
, sollte sein, was es jetzt ist. Das andere Problem war, dass ich es funky nannte ... ... was ich für die Konvertierung von Kaffeeskript aus dem Speicher in JS bekomme.$timeout
; Sie erstellen explizit ein Addt. DOM-Knoten, um einfach Nicht-Dom-Logik auszuführen; Es ist nur wiederverwendbar, wenn sich diese Methode weit oben in der $ scope-Hierarchie befindet, sodass untergeordnete Bereiche sie erben. Ich denke nur, dass sie aus NG-Sicht schlecht aussieht.$timeout(function() {})
um dieelem.ready()
. Ansonsten wurde ein$digest already in progress
Fehler ausgegeben. Aber trotzdem, vielen Dank! Ich habe in der letzten Stunde damit zu kämpfen.Sie können es direkt aufrufen, indem Sie
{{YourFunction()}}
nach dem HTML-Element hinzufügen .Hier ist ein
Plunker Link
.quelle
Ich musste diese Logik beim Umgang mit Google Charts implementieren. Was ich getan habe war, dass ich am Ende meines HTML-Codes innerhalb der Controller-Definition hinzugefügt habe.
und in dieser Funktion rufen Sie einfach Ihre Logik auf.
quelle
Die obige Methode hat bei mir funktioniert
quelle
Sie können die Javascript-Version des Onload-Ereignisses in eckigen js aufrufen. Dieses ng-load-Ereignis kann auf jedes dom-Element wie div, span, body, iframe, img usw. angewendet werden. Über den folgenden Link können Sie ng-load in Ihr vorhandenes Projekt einfügen.
Download ng-load für eckige js
Das folgende Beispiel für iframe zeigt, dass testCallbackFunction nach dem Laden im Controller aufgerufen wird
BEISPIEL
JS
HTML
quelle
Wenn Sie einen bereits laufenden $ Digest-Fehler erhalten, kann dies helfen:
quelle
Das Ausführen nach dem Laden der Seite sollte teilweise erfüllt werden, indem ein Ereignis-Listener auf das Fensterladeereignis gesetzt wird
Innerhalb
module.run(function()...)
des Winkels haben Sie Zugriff auf die Modulstruktur und die Abhängigkeiten.Sie können
broadcast
undemit
Ereignisse für Kommunikationsbrücken.Beispielsweise:
quelle
Ich habe
{{myFunction()}}
in der Vorlage verwendet, aber dann hier einen anderen Weg gefunden, indem ich$timeout
innerhalb des Controllers verwendet habe. Ich dachte, ich würde es teilen, funktioniert großartig für mich.quelle
Wenn ein bestimmtes Element vollständig geladen werden soll, verwenden Sie ng-init für dieses Element.
z.B
<div class="modal fade" id="modalFacultyInfo" role="dialog" ng-init="initModalFacultyInfo()"> ..</div>
Die Funktion initModalFacultyInfo () sollte in der Steuerung vorhanden sein.
quelle
Ich habe festgestellt, dass bei verschachtelten Ansichten $ viewContentLoaded für jede verschachtelte Ansicht ausgelöst wird. Ich habe diese Problemumgehung erstellt, um das endgültige $ viewContentLoaded zu finden. Scheint in Ordnung zu sein, um $ window.prerenderReady wie von Prerender gefordert festzulegen (geht in .run () in der Haupt-App.js):
quelle
quelle
Die Lösung, die für mich funktioniert, ist die folgende
Der Controller-Code lautet wie folgt
HTML-Code ist der folgende
quelle
Ich
setInterval
warte auf den geladenen Inhalt. Ich hoffe, dies kann Ihnen helfen, dieses Problem zu lösen.quelle
setInterval
als Lösung empfehlen ?