Die Antwort
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
ist die einzige, die in den meisten von mir getesteten Szenarien funktioniert. Auf einer Beispielseite mit 4 Komponenten, die alle HTML aus einer Vorlage erstellen, war die Reihenfolge der Ereignisse
$document ready
$onInit
$postLink
(and these 3 were repeated 3 more times in the same order for the other 3 components)
$viewContentLoaded (repeated 3 more times)
$timeout execution (repeated 3 more times)
Daher ist ein $ document.ready () in den meisten Fällen nutzlos, da das im Winkel erstellte DOM möglicherweise noch lange nicht fertig ist.
Interessanter ist jedoch, dass das interessierende Element auch nach dem Auslösen von $ viewContentLoaded immer noch nicht gefunden werden konnte.
Erst nach dem ausgeführten $ timeout wurde es gefunden. Beachten Sie, dass, obwohl das $ timeout einen Wert von 0 hatte, fast 200 Millisekunden verstrichen sind, bevor es ausgeführt wurde, was darauf hinweist, dass dieser Thread eine Weile unterbrochen wurde, vermutlich während dem DOM eckige Vorlagen zu einem Hauptthread hinzugefügt wurden. Die Gesamtzeit von der ersten Ausführung von $ document.ready () bis zur letzten Ausführung von $ timeout betrug fast 500 Millisekunden.
In einem außergewöhnlichen Fall, in dem der Wert einer Komponente festgelegt und der Wert von text () später im $ timeout geändert wurde, musste der $ timeout-Wert erhöht werden, bis er funktionierte (obwohl das Element während des $ timeout gefunden werden konnte ). Durch etwas Asynchrones innerhalb der Komponente eines Drittanbieters hatte ein Wert Vorrang vor dem Text, bis genügend Zeit verstrichen war. Eine andere Möglichkeit ist $ scope. $ EvalAsync, wurde aber nicht ausprobiert.
Ich bin immer noch auf der Suche nach dem einen Ereignis, das mir sagt, dass sich das DOM vollständig beruhigt hat und manipuliert werden kann, damit alle Fälle funktionieren. Bisher ist ein beliebiger Timeout-Wert erforderlich, was bestenfalls bedeutet, dass dies ein Kludge ist, der in einem langsamen Browser möglicherweise nicht funktioniert. Ich habe keine JQuery-Optionen wie liveQuery und Publish / Subscribe ausprobiert, die möglicherweise funktionieren, aber sicherlich nicht rein eckig sind.