A resposta
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
é o único que funciona na maioria dos cenários que testei. Em uma página de amostra com 4 componentes, todos construindo HTML a partir de um modelo, a ordem dos eventos foi
$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)
Portanto, um $ document.ready () é inútil na maioria dos casos, já que o DOM sendo construído em angular pode estar nem perto de pronto.
Porém, mais interessante, mesmo depois que o $ viewContentLoaded foi acionado, o elemento de interesse ainda não foi encontrado.
Somente após o $ timeout executado foi encontrado. Observe que, embora o tempo limite de $ tenha sido o valor 0, quase 200 milissegundos transcorreram antes de ser executado, indicando que esse encadeamento foi suspenso por um bom tempo, presumivelmente enquanto o DOM tinha modelos angulares adicionados em um encadeamento principal. O tempo total desde o primeiro $ document.ready () até a última execução do timeout $ foi de quase 500 milissegundos.
Em um caso extraordinário em que o valor de um componente foi definido e o valor de text () foi alterado posteriormente no tempo limite de $, o valor de tempo limite de $ teve que ser aumentado até que funcionasse (mesmo que o elemento pudesse ser encontrado durante o tempo limite de $ ) Algo assíncrono no componente de terceiros fez com que um valor tivesse precedência sobre o texto até que passasse tempo suficiente. Outra possibilidade é $ scope. $ EvalAsync, mas não foi tentada.
Ainda estou procurando aquele evento que me diz que o DOM se estabeleceu completamente e pode ser manipulado para que todos os casos funcionem. Até o momento, é necessário um valor de tempo limite arbitrário, o que significa, na melhor das hipóteses, que este é um argumento que pode não funcionar em um navegador lento. Eu não tentei opções JQuery como liveQuery e publique / assine, o que pode funcionar, mas certamente não é totalmente angular.