대답
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
내가 테스트 한 대부분의 시나리오에서 작동하는 유일한 것입니다. 템플릿에서 HTML을 빌드하는 4 가지 구성 요소가 포함 된 샘플 페이지에서 이벤트 순서는 다음과 같습니다.
$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 밀리 초였습니다.
구성 요소 값이 설정되고 $ timeout에서 나중에 text () 값이 변경된 특별한 경우 $ timeout 값은 $ timeout 동안 요소를 찾을 수 있었지만 작동 할 때까지 증가해야했습니다. ). 타사 구성 요소 내에서 비동기로 인해 충분한 시간이 지날 때까지 텍스트보다 값이 우선합니다. 다른 가능성은 $ scope. $ evalAsync이지만 시도되지 않았습니다.
나는 여전히 DOM이 완전히 해결되었고 모든 사례가 작동하도록 조작 할 수 있다고 말하는 하나의 이벤트를 찾고 있습니다. 지금까지 임의의 시간 초과 값이 필요합니다. 기껏해야 이것이 느린 브라우저에서 작동하지 않는 kludge임을 의미합니다. 나는 작동 할 수있는 liveQuery 및 publish / subscribe와 같은 JQuery 옵션을 시도하지 않았지만 반드시 순수한 각도는 아닙니다.