Ich weiß, dass ich nicht der erste bin, der danach fragt, aber ich kann in den vorherigen Fragen keine Antwort finden. Ich habe dies in einer Komponente
<div class="col-sm-5">
<laps
[lapsData]="rawLapsData"
[selectedTps]="selectedTps"
(lapsHandler)="lapsHandler($event)">
</laps>
</div>
<map
[lapsData]="rawLapsData"
class="col-sm-7">
</map>
In der Steuerung rawLapsdata
wird von Zeit zu Zeit mutiert.
In laps
werden die Daten als HTML in einem Tabellenformat ausgegeben. Dies ändert sich bei jeder rawLapsdata
Änderung.
Meine map
Komponente muss ngOnChanges
als Auslöser zum Neuzeichnen von Markierungen auf einer Google Map verwendet werden. Das Problem ist, dass ngOnChanges bei rawLapsData
Änderungen im übergeordneten Element nicht ausgelöst wird. Was kann ich tun?
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();
}
Update: ngOnChanges funktioniert nicht, aber es sieht so aus, als würde lapsData aktualisiert. In ngInit befindet sich ein Ereignis-Listener für Zoomänderungen, der auch aufruft this.drawmarkers
. Wenn ich den Zoom ändere, sehe ich tatsächlich eine Änderung der Markierungen. Das einzige Problem ist also, dass ich zum Zeitpunkt der Änderung der Eingabedaten keine Benachrichtigung erhalte.
Im Elternteil habe ich diese Zeile. (Denken Sie daran, dass sich die Änderung in Runden widerspiegelt, jedoch nicht in der Karte.)
this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);
Beachten Sie, dass dies this.rawLapsData
selbst ein Zeiger auf die Mitte eines großen JSON-Objekts ist
this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
zone.run(...)
sollte es dann tun.
ngOnChanges()
nicht aufgerufen. Sie können ngDoCheck()
Ihre eigene Logik verwenden und implementieren, um festzustellen, ob sich der Array-Inhalt geändert hat. lapsData
wird aktualisiert, weil es einen Verweis auf dasselbe Array wie hat / ist rawLapsData
.