Відповідь
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
це єдиний, який працює в більшості тестованих сценаріїв. На зразковій сторінці з 4 компонентами, усі з яких будують HTML із шаблону, був порядок подій
$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)
Отже, $ document.ready () у більшості випадків марний, оскільки DOM, побудований у кутку, може бути ніде не готовим.
Але що цікавіше, навіть після запуску $ viewContentLoaded елемент цікавлення все-таки не вдалося знайти.
Лише після того, як виконано $ timeout, його було знайдено. Зауважте, що навіть незважаючи на те, що $ timeout було значенням 0, минуло майже 200 мілісекунд перед його виконанням, що свідчить про те, що цей потік був затриманий досить довго, імовірно, в той час як у DOM були додані кутові шаблони на основну нитку. Загальний час від першого $ document.ready () до останнього виконання $ timeout становив майже 500 мілісекунд.
В одному надзвичайному випадку, коли було встановлено значення компонента, а потім значення text () було змінено пізніше в $ timeout, значення $ timeout довелося збільшувати, поки воно не спрацювало (навіть якщо елемент можна було знайти під час $ timeout ). Щось асинхронізація в сторонній компоненті призвела до того, що значення має перевагу над текстом, поки не пройде достатній час. Інша можливість - $ range. $ EvalAsync, але її не пробували.
Я все ще шукаю ту саму подію, яка каже мені, що DOM повністю влаштувався і ним можна маніпулювати, щоб усі справи працювали. Поки довільне значення тайм-ауту необхідне, тобто в кращому випадку це хитрість, яка може не працювати у повільному браузері. Я не пробував такі варіанти JQuery, як liveQuery і публікувати / підписатися, які можуть працювати, але, безумовно, не є чистими кутовими.