Jawabannya
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
adalah satu-satunya yang berfungsi di sebagian besar skenario yang saya uji. Di halaman contoh dengan 4 komponen yang semuanya membangun HTML dari templat, urutan acara adalah
$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)
Jadi $ document.ready () tidak berguna dalam banyak kasus karena DOM yang sedang dibangun dalam sudut mungkin belum siap.
Tetapi lebih menarik, bahkan setelah $ viewContentLoaded dipecat, elemen yang menarik masih tidak dapat ditemukan.
Hanya setelah $ timeout dieksekusi ditemukan. Perhatikan bahwa meskipun batas waktu $ adalah nilai 0, hampir 200 milidetik berlalu sebelum dieksekusi, menunjukkan bahwa utas ini tertahan cukup lama, mungkin sementara DOM memiliki templat sudut ditambahkan pada utas utama. Total waktu dari $ document.ready () yang pertama ke eksekusi $ timeout terakhir adalah hampir 500 milidetik.
Dalam satu kasus luar biasa di mana nilai komponen ditetapkan dan kemudian nilai text () diubah kemudian dalam $ timeout, nilai $ timeout harus ditingkatkan hingga berfungsi (walaupun elemen dapat ditemukan selama $ timeout) ). Sesuatu async dalam komponen pihak ke-3 menyebabkan nilai lebih diutamakan dari teks sampai waktu yang cukup berlalu. Kemungkinan lain adalah $ scope. $ EvalAsync, tetapi belum dicoba.
Saya masih mencari satu peristiwa yang memberi tahu saya bahwa DOM telah sepenuhnya tenang dan dapat dimanipulasi sehingga semua kasus bekerja. Sejauh ini nilai batas waktu sewenang-wenang diperlukan, artinya setidaknya ini adalah kludge yang mungkin tidak berfungsi pada browser yang lambat. Saya belum mencoba opsi JQuery seperti liveQuery dan menerbitkan / berlangganan yang mungkin berfungsi, tetapi tentu saja tidak murni sudut.