Odpowiedź
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
jest jedynym, który działa w większości testowanych przeze mnie scenariuszy. Na przykładowej stronie z 4 komponentami, z których wszystkie tworzą HTML z szablonu, kolejność zdarzeń była następująca
$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)
Zatem $ document.ready () jest w większości przypadków bezużyteczny, ponieważ DOM konstruowany pod kątem może nie być prawie gotowy.
Ale co ciekawsze, nawet po uruchomieniu $ viewContentLoaded nie można było znaleźć elementu zainteresowania.
Dopiero po wykonaniu limitu czasu $ został znaleziony. Zauważ, że chociaż wartość limitu czasu $ była równa 0, upłynęło prawie 200 milisekund, zanim zostało wykonane, co wskazuje, że ten wątek został wstrzymany na dłuższą chwilę, prawdopodobnie gdy DOM miał szablony kątowe dodane do głównego wątku. Całkowity czas od pierwszego $ document.ready () do ostatniego $ timeout wyniósł prawie 500 milisekund.
W jednym wyjątkowym przypadku, w którym ustawiono wartość komponentu, a następnie wartość text () zmieniono później w limicie czasu $, wartość limitu czasu $ musiała być zwiększana aż do zadziałania (nawet jeśli element można było znaleźć podczas limitu czasu $ ). Coś asynchronicznego w komponencie innej firmy spowodowało, że wartość miała pierwszeństwo przed tekstem, dopóki nie minęło wystarczająco dużo czasu. Inną możliwością jest $ scope. $ EvalAsync, ale nie został wypróbowany.
Nadal szukam tego jednego wydarzenia, które mówi mi, że DOM całkowicie się ustabilizował i można nim manipulować, aby wszystkie przypadki działały. Jak dotąd konieczna jest dowolna wartość limitu czasu, co oznacza, że w najlepszym wypadku jest to kludge, która może nie działać w wolnej przeglądarce. Nie próbowałem opcji JQuery, takich jak liveQuery i publikować / subskrybować, które mogą działać, ale z pewnością nie są czysto kątowe.