Wie kann ich eine Direktive ausführen, nachdem das Dom mit dem Rendern fertig ist?
Ich habe ein scheinbar einfaches problem, mit keine offensichtliche (durch Lesen der Kantige JS-docs) Lösung.
Ich habe einen Angular JS-Richtlinie, die einige Berechnungen, die auf anderen DOM-Elementen' Höhe an, definieren Sie die Höhe von einem container in der DOM.
Etwas ähnliches Los ist in der Richtlinie:
return function(scope, element, attrs) {
$('.main').height( $('.site-header').height() - $('.site-footer').height() );
}
Das Problem ist, wenn die Richtlinie ausgeführt wird, $('site-header')
gefunden werden kann, wird die Rückgabe eines leeren Arrays statt der jQuery gewickelt DOM-element, die ich brauche.
Gibt es einen Rückruf, dass ich in meiner Richtlinie, der nur ausgeführt wird, nachdem das DOM geladen wurde und ich kann auf anderen DOM-Elemente über die normale jQuery-Selektor-Stil Abfragen?
InformationsquelleAutor der Frage Jannis | 2012-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt davon ab, wie Ihre $('site-header') aufgebaut ist.
Können Sie versuchen, zu verwenden $timeout mit 0 Verzögerung. So etwas wie:
Erklärungen, wie es funktioniert: einzwei.
Vergessen Sie nicht, zu injizieren
$timeout
in Ihrer Richtlinie:InformationsquelleAutor der Antwort Artem Andreev
Hier ist, wie ich es mache:
InformationsquelleAutor der Antwort rjm226
Wahrscheinlich der Autor nicht brauchen, meine Antwort nicht mehr. Trotzdem, der Vollständigkeit halber habe ich das Gefühl andere Benutzer Sie nützlich finden könnten. Die beste und einfachste Lösung ist die Verwendung
$(window).load()
im inneren des Körpers von der Funktion zurückgegeben. (alternativ können Siedocument.ready
. Es hängt wirklich, wenn Sie müssen alle die Bilder oder nicht).Mit
$timeout
meiner bescheidenen Meinung nach ist eine sehr schwache option und kann in einigen Fällen fehlschlagen.Hier ist der komplette code, den ich verwenden würde:
InformationsquelleAutor der Antwort jnardiello
es ist ein
ngcontentloaded
Veranstaltung, ich denke, Sie können es verwenden,InformationsquelleAutor der Antwort sunderls
Wenn Sie nicht verwenden können, $timeout aufgrund von externen Ressourcen und cant verwenden Sie eine Richtlinie, durch die auf ein bestimmtes Problem mit dem timing, broadcast.
Hinzufügen
$scope.$broadcast("variable_name_here");
nachdem die gewünschte externe Ressource oder lange laufen-controller/Richtlinie abgeschlossen hat.Dann fügen Sie den unten nach Ihren externen Ressource geladen wurde.
Beispielsweise in der Verheißung eines latenten HTTP-request.
InformationsquelleAutor der Antwort JSV
Ich hatte ein ähnliches problem und meine Lösung hier.
Ich habe Folgendes HTML:
Problem: In der link-Funktion der Direktive des parent-div, ich wollte jquery ' Ing das Kind div#sub. Aber es gab mir nur ein leeres Objekt, weil die ng-include nicht fertig war, wenn die link-Funktion der Direktive ran. So zuerst machte ich einen dirty workaround mit $timeout, was auch geklappt hat aber der delay-parameter hing auf client-Geschwindigkeit (mag niemand).
Funktioniert, aber dreckig:
Ist hier die saubere Lösung:
Vielleicht hilft es jemanden.
InformationsquelleAutor der Antwort jaheraho