Sé que no soy el primero en preguntar sobre esto, pero no puedo encontrar una respuesta en las preguntas anteriores. Tengo esto en 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>
En el controlador rawLapsdatase muta de vez en cuando.
En laps, los datos se generan como HTML en formato tabular. Esto cambia cada vez que rawLapsdatacambia.
Mi mapcomponente debe usarse ngOnChangescomo desencadenante para volver a dibujar marcadores en un mapa de Google. El problema es que ngOnChanges no se dispara cuando hay rawLapsDatacambios en el padre. ¿Que puedo hacer?
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();
}
Actualización: ngOnChanges no funciona, pero parece que lapsData se está actualizando. En el ngInit es un detector de eventos para cambios de zoom que también llama this.drawmarkers. Cuando cambio el zoom, sí veo un cambio en los marcadores. Entonces, el único problema es que no recibo la notificación en el momento en que cambian los datos de entrada.
En el padre, tengo esta línea. (Recuerde que el cambio se refleja en vueltas, pero no en el mapa).
this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);
Y tenga en cuenta que this.rawLapsDataes en sí mismo un puntero al centro de un gran objeto json
this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
zone.run(...)debería hacerlo entonces.
ngOnChanges()lo que no se llamará. Puede usar ngDoCheck()e implementar su propia lógica para determinar si el contenido de la matriz ha cambiado. lapsDatase actualiza porque tiene / es una referencia a la misma matriz que rawLapsData.