อันที่จริงมีสองวิธีในการตรวจจับและดำเนินการเมื่ออินพุตเปลี่ยนแปลงในองค์ประกอบลูกในเชิงมุม 2 +:
- คุณสามารถใช้วิธีวงจรชีวิต ngOnChanges ()ดังที่กล่าวไว้ในคำตอบที่เก่ากว่า:
@Input() categoryId: string;
ngOnChanges(changes: SimpleChanges) {
this.doSomething(changes.categoryId.currentValue);
// You can also use categoryId.previousValue and
// categoryId.firstChange for comparing old and new values
}
เอกสารลิงค์: ngOnChanges, SimpleChanges, SimpleChange
ตัวอย่างสาธิต: ดูที่plunker นี้
- อีกทางหนึ่งคุณยังสามารถใช้setter คุณสมบัติอินพุตดังนี้:
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
การเชื่อมโยงเอกสารอ้างอิง: ดูที่นี่
ตัวอย่างการสาธิต: ดูที่พลั่วเกอร์นี้
คุณควรใช้วิธีการใด
หากองค์ประกอบของคุณมีหลายอินพุตดังนั้นหากคุณใช้ ngOnChanges () คุณจะได้รับการเปลี่ยนแปลงทั้งหมดสำหรับอินพุตทั้งหมดพร้อมกันภายใน ngOnChanges () การใช้วิธีการนี้คุณสามารถเปรียบเทียบค่าปัจจุบันและค่าก่อนหน้าของอินพุตที่เปลี่ยนแปลงและดำเนินการตามความเหมาะสม
อย่างไรก็ตามหากคุณต้องการทำอะไรบางอย่างเมื่อมีการเปลี่ยนแปลงอินพุตเพียงครั้งเดียว (และคุณไม่สนใจอินพุตอื่น) มันอาจง่ายกว่าที่จะใช้ setter คุณสมบัติอินพุต อย่างไรก็ตามวิธีนี้ไม่ได้มีวิธีการเปรียบเทียบค่าก่อนหน้าและปัจจุบันของอินพุตที่มีการเปลี่ยนแปลง (ซึ่งคุณสามารถทำได้อย่างง่ายดายด้วยเมธอดวงจรชีวิต ngOnChanges)
แก้ไข 2017-07-25: การเปลี่ยนแปลงการตรวจจับอาจจะไม่เกิดไฟไหม้ภายใต้วงจรบางอย่าง
โดยปกติแล้วการตรวจสอบการเปลี่ยนแปลงสำหรับทั้งหมาและ ngOnChanges จะยิงเมื่อใดก็ตามที่องค์ประกอบของผู้ปกครองที่มีการเปลี่ยนแปลงข้อมูลที่ส่งผ่านไปยังลูกได้หากข้อมูลที่เป็นประเภทข้อมูลดั้งเดิม JS (สตริงจำนวนบูล) อย่างไรก็ตามในสถานการณ์ต่อไปนี้มันจะไม่เริ่มทำงานและคุณต้องดำเนินการพิเศษเพื่อให้สามารถใช้งานได้
หากคุณใช้วัตถุหรืออาร์เรย์ที่ซ้อนกัน (แทนที่จะเป็นชนิดข้อมูลดั้งเดิมของ JS) เพื่อส่งผ่านข้อมูลจากพาเรนต์ไปยังลูกการตรวจจับการเปลี่ยนแปลง (โดยใช้ setter หรือ ngchanges) อาจไม่ทำงานตามที่กล่าวไว้ในคำตอบโดยผู้ใช้: muetzerich สำหรับการแก้ปัญหาดูที่นี่
หากคุณกำลังกลายพันธุ์ข้อมูลภายนอกบริบทเชิงมุม (เช่นจากภายนอก) ดังนั้นมุมจะไม่ทราบการเปลี่ยนแปลง คุณอาจต้องใช้ ChangeDetectorRef หรือ NgZone ในองค์ประกอบของคุณเพื่อทำให้มุมรับรู้ถึงการเปลี่ยนแปลงภายนอกและทำให้เกิดการตรวจจับการเปลี่ยนแปลง อ้างถึงนี้