So di non essere il primo a chiederlo, ma non riesco a trovare una risposta nelle domande precedenti. Ho questo in un componente
<div class="col-sm-5">
<laps
[lapsData]="rawLapsData"
[selectedTps]="selectedTps"
(lapsHandler)="lapsHandler($event)">
</laps>
</div>
<map
[lapsData]="rawLapsData"
class="col-sm-7">
</map>
Nel controller rawLapsdata
viene mutato di volta in volta.
In laps
, i dati vengono emessi come HTML in un formato tabulare. Questo cambia ogni volta che rawLapsdata
cambia.
Il mio map
componente deve essere utilizzato ngOnChanges
come trigger per ridisegnare i marker su una mappa di Google. Il problema è che ngOnChanges non si attiva quando si verificano rawLapsData
modifiche nel genitore. Cosa posso fare?
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();
}
Aggiornamento: ngOnChanges non funziona, ma sembra che lapsData sia in fase di aggiornamento. In ngInit è presente un listener di eventi per le modifiche dello zoom che chiama anche this.drawmarkers
. Quando cambio lo zoom vedo davvero un cambiamento nei marker. Quindi l'unico problema è che non ricevo la notifica al momento della modifica dei dati di input.
Nel genitore, ho questa linea. (Ricorda che la modifica si riflette nei giri, ma non nella mappa).
this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);
E nota che this.rawLapsData
è esso stesso un puntatore al centro di un grande oggetto json
this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
zone.run(...)
dovrebbe farlo allora.
ngOnChanges()
non verrà chiamato. È possibile utilizzare ngDoCheck()
e implementare la propria logica per determinare se il contenuto dell'array è stato modificato. lapsData
viene aggiornato perché ha / è un riferimento allo stesso array di rawLapsData
.