Câu trả lời
$scope.$watch('$viewContentLoaded',
function() {
$timeout(function() {
//do something
},0);
});
là cái duy nhất hoạt động trong hầu hết các kịch bản tôi đã thử nghiệm. Trong một trang mẫu có 4 thành phần, tất cả đều xây dựng HTML từ một mẫu, thứ tự các sự kiện là
$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)
Vì vậy, hầu hết các trường hợp $ document. Yet () là vô dụng vì DOM được xây dựng theo góc có thể không sẵn sàng.
Nhưng thú vị hơn, ngay cả sau khi $ viewContentLoaded bị bắn, yếu tố quan tâm vẫn không thể tìm thấy.
Chỉ sau khi $ timeout thực thi thì nó mới được tìm thấy. Lưu ý rằng mặc dù thời gian chờ $ là giá trị 0, gần 200 mili giây đã trôi qua trước khi nó được thực thi, chỉ ra rằng luồng này đã bị trì hoãn khá lâu, có lẽ trong khi DOM có các mẫu góc được thêm vào một luồng chính. Tổng thời gian từ $ document. Yet () đến lần thực hiện $ timeout cuối cùng là gần 500 mili giây.
Trong một trường hợp đặc biệt khi giá trị của một thành phần được đặt và sau đó giá trị text () được thay đổi sau khi hết thời gian chờ, giá trị $ timeout phải được tăng cho đến khi nó hoạt động (mặc dù có thể tìm thấy phần tử trong thời gian chờ $ ). Một cái gì đó không đồng bộ trong thành phần bên thứ 3 khiến giá trị được ưu tiên hơn văn bản cho đến khi đủ thời gian trôi qua. Một khả năng khác là $ scope. $ EvalAsync, nhưng không được thử.
Tôi vẫn đang tìm kiếm một sự kiện cho tôi biết DOM đã hoàn toàn ổn định và có thể được xử lý để mọi trường hợp đều hoạt động. Cho đến nay, một giá trị thời gian chờ tùy ý là cần thiết, có nghĩa là tốt nhất đây là một loại bùn có thể không hoạt động trên trình duyệt chậm. Tôi chưa thử các tùy chọn JQuery như liveQuery và xuất bản / đăng ký có thể hoạt động, nhưng chắc chắn không phải là góc cạnh thuần túy.