La respuesta
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
es el único que funciona en la mayoría de los escenarios que probé. En una página de muestra con 4 componentes que construyen HTML a partir de una plantilla, el orden de los eventos fue
$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)
Por lo tanto, un $ document.ready () es inútil en la mayoría de los casos, ya que el DOM que se construye en angular puede no estar listo para nada.
Pero más interesante, incluso después de que $ viewContentLoaded se disparó, el elemento de interés aún no se pudo encontrar.
Solo después de que se ejecutó el tiempo de espera $ se encontró. Tenga en cuenta que a pesar de que el tiempo de espera $ era un valor de 0, transcurrieron casi 200 milisegundos antes de ejecutarse, lo que indica que este subproceso se suspendió durante bastante tiempo, presumiblemente mientras el DOM tenía plantillas angulares agregadas en un subproceso principal. El tiempo total desde el primer $ document.ready () hasta la última ejecución de $ timeout fue de casi 500 milisegundos.
En un caso extraordinario en el que se estableció el valor de un componente y luego el valor text () se cambió más tarde en el tiempo de espera $, el valor de tiempo de espera tuvo que incrementarse hasta que funcionó (aunque el elemento se pudo encontrar durante el tiempo de espera $ ) Algo asíncrono dentro del componente de terceros hizo que un valor tuviera prioridad sobre el texto hasta que transcurriera el tiempo suficiente. Otra posibilidad es $ scope. $ EvalAsync, pero no se intentó.
Todavía estoy buscando ese evento que me dice que el DOM se ha establecido por completo y puede ser manipulado para que todos los casos funcionen. Hasta ahora es necesario un valor de tiempo de espera arbitrario, lo que significa que en el mejor de los casos es un error que puede no funcionar en un navegador lento. No he probado las opciones de JQuery como liveQuery y publicar / suscribir, que pueden funcionar, pero ciertamente no son angulares.