การตรวจจับการเปลี่ยนแปลงคืออะไร? บทความต่อไปนี้จะพูดถึงกลไกการตรวจจับการเปลี่ยนแปลงใน Angular แนะนำวิธีที่การเปลี่ยนแปลงสถานะแจ้งเตือนการตรวจจับการเปลี่ยนแปลง และกลยุทธ์การตรวจจับการเปลี่ยนแปลงเชิงมุม ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน
สรุป:检测机制
การเปลี่ยนแปลงที่สำรวจแผนผังส่วนประกอบ ตรวจสอบการเปลี่ยนแปลงในแต่ละส่วนประกอบ และทริกเกอร์การอัปเดต DOM
เมื่อคุณสมบัติของส่วนประกอบเปลี่ยนแปลง [บทช่วยสอนที่เกี่ยวข้องที่แนะนำ: "บทช่วยสอนเชิงมุม"]
งานพื้นฐานของการตรวจจับการเปลี่ยนแปลง: รับ状态
ภายในของโปรแกรมและทำให้可见
ในส่วนต่อประสานผู้ใช้ สถานะนี้สามารถเป็นวัตถุ อาร์เรย์ หรือชนิดข้อมูลพื้นฐานก็ได้
แหล่งที่มาที่ขับเคลื่อนด้วยเหตุการณ์แบ่งออกเป็นสามประเภทต่อไปนี้:
เหตุการณ์: คลิกหน้า, ส่ง, เลื่อนเมาส์ลง...
XHR: รับข้อมูลจากเซิร์ฟเวอร์แบ็กเอนด์
ตัวจับเวลา: setTimeout(), setInterval()
จุดเหล่านี้มีสิ่งหนึ่งที่เหมือนกัน นั่นคือ ทั้งหมดเป็นแบบอะซิงโครนัส กล่าวคือ异步操作
งโครนัสทั้งหมดเป็นปัจจัยรากที่อาจทำให้เกิดการเปลี่ยนแปลงข้อมูล ดังนั้นเมื่อใดก็ตามที่มีการดำเนินการแบบอะซิงโครนัสบางอย่าง สถานะของแอปพลิเคชันของเราอาจเปลี่ยนแปลงได้ ในเวลานี้ คุณต้องอัปเดตมุมมอง
ใน Angular
มีการเชื่อมต่อ NgZone
ซึ่งจะตรวจสอบ异步事件
ทั้งหมดของ Angular จะเขียนใหม่ (ผ่าน Zone.js
) API ของเบราว์เซอร์พื้นฐานบางส่วนเมื่อเริ่มต้น (สกัดกั้นเหตุการณ์อะซิงโครนัสทั้งหมดอย่างรุนแรง)
มีสองวิธีทั่วไปในการทริกเกอร์การตรวจจับการเปลี่ยนแปลง วิธีหนึ่งจะขึ้นอยู่กับ hooks ของวงจรชีวิตของส่วนประกอบ
ngAfterViewChecked() { console.log('คลัสเตอร์-master.component cd'); -
อีกวิธีหนึ่งคือควบคุมการเปิดหรือปิดการตรวจจับการเปลี่ยนแปลงด้วยตนเองและทริกเกอร์ด้วยตนเอง
ตัวสร้าง (ซีดีส่วนตัว: ChangeDetectorRef) { cd.ถอด() setInterval(() => { นี้.cd.detectChanges() }, 5,000) -
แกนหลักของ Angular คือการจัดองค์ประกอบ ในที่สุดการซ้อนส่วนประกอบจะก่อตัวเป็น组件树
ส่วนประกอบ การ变化检测器ChangeDetector
การเปลี่ยนแปลงของ Angular สามารถแบ่งออกเป็นส่วนประกอบต่างๆ ได้
ใน Angular แต่ละส่วนประกอบจะมีตัวตรวจจับการเปลี่ยนแปลงของตัวเอง ซึ่งช่วยให้เราสามารถควบคุมวิธีการและเวลาที่จะดำเนินการตรวจจับการเปลี่ยนแปลงสำหรับแต่ละส่วนประกอบ
Angular ยังช่วยให้นักพัฒนาสามารถปรับแต่งกลยุทธ์การตรวจจับการเปลี่ยนแปลงได้
ค่าเริ่มต้น: การตรวจจับการเปลี่ยนแปลง每次
จะทำให้เกิดการตรวจจับการเปลี่ยนแปลงของส่วนประกอบ รวมถึงการเปลี่ยนแปลงสถานะของ其他组件
และการเปลี่ยนแปลงค่าแอตทริบิวต์ภายในของตัวแปรอ้างอิง本组件
Onpush: การตรวจจับการเปลี่ยนแปลงแต่ละครั้งจะข้ามการตรวจสอบการเปลี่ยนแปลงของส่วนประกอบนี้ เว้นแต่满足一些条件
4.1 ค่าเริ่มต้น
กลไกการตรวจจับการเปลี่ยนแปลงเริ่มต้นของ Angular คือ ChangeDetectionStrategy.Default
หลังจากการเรียกกลับเหตุการณ์แบบอะซิงโครนัสแต่ละครั้งสิ้นสุดลง NgZone จะทริก整个组件树
เพื่อดำเนินการตรวจจับการเปลี่ยนแปลง至上而下
4.2 onPush
กลยุทธ์ OnPush ใช้เพื่อ跳过
การตรวจจับการเปลี่ยนแปลงของส่วนประกอบและ所有子组件
ที่อยู่ข้างใต้
ที่จริงแล้ว หลังจากที่ตั้งค่านโยบาย OnPush
แล้ว ยังมีหลายวิธีในการทริกเกอร์การตรวจจับการเปลี่ยนแปลง
1)引用
การเปลี่ยนแปลงแอตทริบิวต์ @Input
ของส่วนประกอบ
2) เหตุการณ์ DOM
ภายในส่วนประกอบ รวมถึงเหตุการณ์ DOM ของส่วนประกอบย่อย เช่น click、submit、mouse down
3) Observable
ในองค์ประกอบสมัครรับเหตุการณ์และตั้งค่า Async pipe
ในเวลาเดียวกัน
4) ใช้เมธอด ChangeDetectorRef.detectChanges()、ChangeDetectorRef.markForCheck()、ApplicationRef.tick()
ด้วยตนเองในคอมโพเนนต์
markForCheck(): ใช้สำหรับ子组件
该子组件到根组件
โดยแจ้งให้เครื่องตรวจจับเชิงมุมตรวจ一定
ส่วนประกอบบนเส้นทางนี้ในระหว่างการตรวจจับการเปลี่ยนแปลงครั้งถัดไป แม้ว่ากลยุทธ์การตรวจจับการเปลี่ยนแปลงจะถูกตั้งค่าเป็น onPush
detectorChanges(): เริ่มต้นการตรวจจับการเปลี่ยนแปลงจาก该组件到各个子组件
ด้วยตนเอง
detach():脱离
ตัวตรวจจับส่วนประกอบออกจากจำนวนตัวตรวจจับ และกลไกการตรวจจับจะไม่ถูกควบคุมอีกต่อไป เว้นแต่จะติดตั้งกลับเข้าไปใหม่
reattach():重新链接
เครื่องตรวจจับที่แยกออกมาเข้ากับแผนผังเครื่องตรวจจับอีกครั้ง