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 rawLapsdata
muda.
Meu map
componente precisa usar ngOnChanges
como gatilho para redesenhar marcadores em um mapa do Google. O problema é que o ngOnChanges não é acionado quando as rawLapsData
alteraçõ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.rawLapsData
ele 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
.