Sei que não sou o primeiro a perguntar sobre isso, mas não consigo encontrar uma resposta nas perguntas anteriores. Eu tenho isso em um componente
<div class="col-sm-5">
<laps
[lapsData]="rawLapsData"
[selectedTps]="selectedTps"
(lapsHandler)="lapsHandler($event)">
</laps>
</div>
<map
[lapsData]="rawLapsData"
class="col-sm-7">
</map>
No controlador rawLapsdataé alterado de tempos em tempos.
Em laps, os dados são enviados como HTML em um formato tabular. Isso muda sempre que rawLapsdatamuda.
Meu mapcomponente precisa usar ngOnChangescomo gatilho para redesenhar marcadores em um mapa do Google. O problema é que o ngOnChanges não é acionado quando as rawLapsDataalterações no pai. O que eu posso fazer?
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();
}
Atualização: ngOnChanges não está funcionando, mas parece que lapsData está sendo atualizado. No ngInit, há um ouvinte de eventos para alterações de zoom que também chama this.drawmarkers. Quando mudo o zoom, vejo de fato uma mudança nos marcadores. Portanto, o único problema é que não recebo a notificação no momento em que os dados de entrada são alterados.
No pai, eu tenho essa linha. (Lembre-se de que a mudança é refletida em voltas, mas não no mapa).
this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);
E observe que this.rawLapsDataele próprio é um ponteiro para o meio de um objeto json grande
this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
zone.run(...)deve fazê-lo então.
ngOnChanges()não será chamada. Você pode usar ngDoCheck()e implementar sua própria lógica para determinar se o conteúdo da matriz foi alterado. lapsDataé atualizado porque possui / é uma referência à mesma matriz que rawLapsData.