La réponse
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
est le seul qui fonctionne dans la plupart des scénarios que j'ai testés. Dans une page d'exemple avec 4 composants qui construisent tous du HTML à partir d'un modèle, l'ordre des événements était
$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)
Ainsi, un $ document.ready () est inutile dans la plupart des cas, car le DOM en cours de construction en angulaire peut être loin d'être prêt.
Mais plus intéressant, même après le tir de $ viewContentLoaded, l'élément d'intérêt n'a toujours pas pu être trouvé.
Ce n'est qu'après l'exécution du délai d'expiration $ qu'il a été trouvé. Notez que même si le délai d'expiration $ était une valeur de 0, près de 200 millisecondes se sont écoulées avant son exécution, ce qui indique que ce thread a été suspendu pendant un certain temps, probablement pendant que le DOM avait des modèles angulaires ajoutés sur un thread principal. Le temps total entre la première exécution de $ document.ready () et la dernière exécution de $ timeout était de près de 500 millisecondes.
Dans un cas extraordinaire où la valeur d'un composant a été définie, puis la valeur text () a été modifiée plus tard dans le délai d'expiration $, la valeur $ timeout a dû être augmentée jusqu'à ce qu'elle fonctionne (même si l'élément pouvait être trouvé pendant le délai d'expiration $ ). Quelque chose d'async dans le composant tiers a provoqué une valeur sur le texte jusqu'à ce que suffisamment de temps se soit écoulé. Une autre possibilité est $ scope. $ EvalAsync, mais n'a pas été essayée.
Je suis toujours à la recherche de cet événement qui me dit que le DOM s'est complètement installé et peut être manipulé pour que tous les cas fonctionnent. Jusqu'à présent, une valeur de timeout arbitraire est nécessaire, ce qui signifie au mieux qu'il s'agit d'un kludge qui peut ne pas fonctionner sur un navigateur lent. Je n'ai pas essayé les options JQuery comme liveQuery et publication / abonnement qui peuvent fonctionner, mais ne sont certainement pas purement angulaires.