คำตอบ
$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 เท่านั้น โปรดทราบว่าแม้ว่าการหมดเวลาของ $ จะมีค่าเป็น 0 แต่ผ่านไปเกือบ 200 มิลลิวินาทีก่อนที่จะถูกดำเนินการแสดงว่าเธรดนี้ถูกพักไว้ชั่วครู่หนึ่งสันนิษฐานว่าในขณะที่ DOM มีเทมเพลตเชิงมุมเพิ่มบนเธรดหลัก เวลาทั้งหมดจาก $ document.ready () ครั้งแรกถึงการดำเนินการหมดเวลา $ ครั้งสุดท้ายคือเกือบ 500 มิลลิวินาที
ในกรณีพิเศษหนึ่งกรณีที่มีการตั้งค่าองค์ประกอบและจากนั้นค่าข้อความ () จะถูกเปลี่ยนในภายหลังในการหมดเวลา $ $ ค่าการหมดเวลา $ จะต้องเพิ่มขึ้นจนกว่าจะทำงาน (แม้ว่าจะพบองค์ประกอบในระหว่างการหมดเวลา $ ) บางสิ่งบางอย่างในอุปกรณ์ของบุคคลที่สามทำให้เกิดค่า async นำหน้าข้อความจนเวลาผ่านไป ความเป็นไปได้อีกอย่างคือ $ scope $ evalAsync แต่ไม่ได้ลอง
ฉันยังคงมองหาเหตุการณ์หนึ่งที่บอกฉันว่า DOM ได้ตัดสินอย่างสมบูรณ์และสามารถจัดการเพื่อให้ทุกกรณีทำงานได้ จนถึงตอนนี้จำเป็นต้องใช้ค่าไทม์เอาต์โดยพลการซึ่งหมายความว่านี่เป็น kludge ที่อาจไม่ทำงานบนเบราว์เซอร์ที่ทำงานช้า ฉันไม่ได้ลองตัวเลือก JQuery เช่น liveQuery และเผยแพร่ / สมัครสมาชิกซึ่งอาจใช้งานได้ แต่แน่นอนว่าไม่ใช่เชิงมุมที่บริสุทธิ์