สำหรับผู้ที่สร้างแอปพลิเคชันที่ซับซ้อนโปรดทราบว่ามีผลกระทบต่อประสิทธิภาพในการเลือกของคุณ นอกจากนี้ฉันต้องการทำเครื่องหมายคำตอบให้ครบถ้วนพร้อมรายละเอียดทางเทคนิคเพิ่มเติม:
$ timeout (callback)จะรอรอบการแยกย่อยปัจจุบัน (เช่นการอัปเดตเชิงมุมทุกรุ่นและ DOM) จากนั้นมันจะดำเนินการติดต่อกลับ - อาจส่งผลกระทบต่อโมเดลเชิงมุม - จากนั้นจะเปิดใช้งานเต็ม$apply
รูท $ ขอบเขตและ redigest ทุกอย่าง
$ evalAsync (การเรียกกลับ)ในทางกลับกันจะเพิ่มการเรียกกลับไปยังรอบปัจจุบันหรือรอบย่อย ซึ่งหมายความว่าหากคุณอยู่ในวงจรย่อย (ตัวอย่างเช่นในฟังก์ชั่นที่เรียกจากng-click
คำสั่งบางส่วน) สิ่งนี้จะไม่รออะไรเลยรหัสจะถูกดำเนินการทันที หากคุณอยู่ในการโทรแบบอะซิงโครนัสตัวอย่างเช่น a setTimeout
รอบการสรุปใหม่ ( $apply
) จะถูกเรียกใช้
ดังนั้นในแง่ของการแสดงจะเป็นการดีกว่าเสมอที่จะเรียก$evalAsync
เว้นแต่ว่ามันสำคัญสำหรับคุณว่ามุมมองนั้นทันสมัยก่อนที่จะเรียกใช้งานโค้ดของคุณตัวอย่างเช่นถ้าคุณต้องการ acces สำหรับแอ็ตทริบิวต์ DOm เช่นความกว้างองค์ประกอบ
หากคุณต้องการรายละเอียดเพิ่มเติมเกี่ยวกับความแตกต่างระหว่าง $ timeout, $ evalAsync, $ digest, $ Apply ฉันขอเชิญคุณอ่านคำตอบของฉันในคำถามอื่น: https://stackoverflow.com/a/23102223/1501926
นอกจากนี้โปรดอ่านเอกสารประกอบ :
$ evalAsync ไม่รับประกันว่าเมื่อใดที่นิพจน์จะถูกดำเนินการเฉพาะที่:
- มันจะดำเนินการหลังจากฟังก์ชั่นที่กำหนดเวลาการประเมินผล (ควรก่อนการแสดงผล DOM)
- อย่างน้อยหนึ่งรอบ $ แยกย่อยจะดำเนินการหลังจากการดำเนินการแสดงออก
หมายเหตุ: ถ้าฟังก์ชั่นนี้จะเรียกว่าด้านนอกของ $ ย่อยวงจรเป็น $ ใหม่แยกแยะวงจรจะกำหนด อย่างไรก็ตามขอแนะนำให้ใช้รหัสการโทรที่เปลี่ยนแปลงรูปแบบจากภายในการโทรแบบใช้ $ ซึ่งรวมถึงรหัสที่ประเมินผ่าน $ evalAsync