ฉันรู้ว่าฉันไม่ใช่คนแรกที่ถามเกี่ยวกับเรื่องนี้ แต่ฉันไม่พบคำตอบในคำถามก่อนหน้านี้ ฉันมีสิ่งนี้ในส่วนประกอบเดียว
<div class="col-sm-5">
<laps
[lapsData]="rawLapsData"
[selectedTps]="selectedTps"
(lapsHandler)="lapsHandler($event)">
</laps>
</div>
<map
[lapsData]="rawLapsData"
class="col-sm-7">
</map>
ในคอนโทรลเลอร์rawLapsdata
จะกลายพันธุ์เป็นครั้งคราว
ในlaps
ข้อมูลจะถูกส่งออกเป็น HTML ในรูปแบบตาราง สิ่งนี้จะเปลี่ยนแปลงทุกrawLapsdata
ครั้งที่มีการเปลี่ยนแปลง
map
ส่วนประกอบของฉันจำเป็นต้องใช้ngOnChanges
เป็นตัวกระตุ้นในการวาดเครื่องหมายบน Google Map ปัญหาคือ ngOnChanges ไม่เริ่มทำงานเมื่อมีrawLapsData
การเปลี่ยนแปลงในพาเรนต์ ฉันจะทำอะไรได้บ้าง?
import {Component, Input, OnInit, OnChanges, SimpleChange} from 'angular2/core';
@Component({
selector: 'map',
templateUrl: './components/edMap/edMap.html',
styleUrls: ['./components/edMap/edMap.css']
})
export class MapCmp implements OnInit, OnChanges {
@Input() lapsData: any;
map: google.maps.Map;
ngOnInit() {
...
}
ngOnChanges(changes: { [propName: string]: SimpleChange }) {
console.log('ngOnChanges = ', changes['lapsData']);
if (this.map) this.drawMarkers();
}
อัปเดต: ngOnChanges ไม่ทำงาน แต่ดูเหมือนว่ากำลังอัปเดต lapsData ใน ngInit เป็นตัวฟังเหตุการณ์สำหรับการเปลี่ยนแปลงการซูมที่เรียกthis.drawmarkers
ด้วย เมื่อฉันเปลี่ยนการซูมฉันเห็นการเปลี่ยนแปลงของเครื่องหมาย ดังนั้นปัญหาเดียวคือฉันไม่ได้รับการแจ้งเตือนในเวลาที่ข้อมูลอินพุตเปลี่ยนแปลง
ในผู้ปกครองฉันมีบรรทัดนี้ (โปรดจำไว้ว่าการเปลี่ยนแปลงจะแสดงในรอบ แต่ไม่ปรากฏในแผนที่)
this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);
และสังเกตว่านั่นthis.rawLapsData
คือตัวชี้ไปที่ตรงกลางของวัตถุ json ขนาดใหญ่
this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
zone.run(...)
ควรทำในตอนนั้น
ngOnChanges()
จะไม่ถูกเรียก คุณสามารถใช้ngDoCheck()
และปรับใช้ตรรกะของคุณเองเพื่อตรวจสอบว่าเนื้อหาอาร์เรย์มีการเปลี่ยนแปลงหรือไม่ lapsData
มีการปรับปรุงเพราะมันมี / rawLapsData
มีการอ้างอิงถึงอาร์เรย์เดียวกับ