La risposta
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
è l'unico che funziona nella maggior parte degli scenari che ho testato. In una pagina di esempio con 4 componenti che generano HTML da un modello, l'ordine degli eventi era
$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)
Quindi un $ document.ready () è inutile nella maggior parte dei casi poiché il DOM in costruzione in angolare potrebbe non essere quasi pronto.
Ma più interessante, anche dopo che $ viewContentLoaded è stato attivato, l'elemento di interesse non è stato ancora trovato.
È stato trovato solo dopo il timeout $ eseguito. Si noti che anche se il timeout $ era un valore di 0, sono trascorsi quasi 200 millisecondi prima che venisse eseguito, indicando che questo thread è stato sospeso per un bel po ', presumibilmente mentre il DOM aveva modelli angolari aggiunti su un thread principale. Il tempo totale dal primo $ document.ready () all'ultima esecuzione $ timeout è stato di quasi 500 millisecondi.
In un caso straordinario in cui è stato impostato il valore di un componente e quindi il valore text () è stato modificato successivamente nel timeout $, il valore $ timeout è stato aumentato fino a quando non ha funzionato (anche se l'elemento è stato trovato durante il timeout $ ). Qualcosa di asincrono all'interno del componente di terze parti ha fatto sì che un valore avesse la precedenza sul testo fino a quando non fosse trascorso un tempo sufficiente. Un'altra possibilità è $ scope. $ EvalAsync, ma non è stato provato.
Sto ancora cercando quell'unico evento che mi dice che il DOM si è completamente stabilizzato e può essere manipolato in modo che tutti i casi funzionino. Finora è necessario un valore di timeout arbitrario, nel migliore dei casi si tratta di un kludge che potrebbe non funzionare su un browser lento. Non ho provato le opzioni di JQuery come liveQuery e pubblicazione / sottoscrizione che potrebbero funzionare, ma certamente non sono pure angolari.