Ответ
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
единственный, который работает в большинстве сценариев, которые я тестировал. На образце страницы с 4 компонентами, каждый из которых строит HTML из шаблона, порядок событий был
$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)
Таким образом, $ document.ready () в большинстве случаев бесполезен, так как DOM, построенный в угловом формате, может быть далеко не готов.
Но что более интересно, даже после запуска $ viewContentLoaded интересующий элемент все еще не может быть найден.
Только после выполнения таймаута $ он был найден. Обратите внимание, что, хотя значение $ timeout было равно 0, до его выполнения прошло около 200 миллисекунд, что указывает на то, что этот поток удерживался довольно долго, предположительно, в то время как в DOM были добавлены угловые шаблоны в основной поток. Общее время от первого выполнения $ document.ready () до последнего выполнения $ timeout составило почти 500 миллисекунд.
В одном необычном случае, когда было установлено значение компонента, а затем значение text () было изменено позже в $ timeout, значение $ timeout нужно было увеличивать до тех пор, пока оно не заработало (даже если элемент можно было найти во время $ timeout ). Что-то асинхронное в стороннем компоненте заставило значение иметь приоритет над текстом, пока не прошло достаточно времени. Другая возможность - это $ scope. $ EvalAsync, но она не была опробована.
Я все еще ищу одно событие, которое говорит мне, что DOM полностью остановился и им можно манипулировать, чтобы все случаи работали. Пока что необходимо произвольное значение тайм-аута, то есть в лучшем случае это кладжа, которая может не работать в медленном браузере. Я не пробовал варианты JQuery, такие как liveQuery и публикация / подписка, которые могут работать, но, конечно, не являются чисто угловатыми.