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 rawLapsdata
se muta de vez en cuando.
En laps
, los datos se generan como HTML en formato tabular. Esto cambia cada vez que rawLapsdata
cambia.
Mi map
componente debe usarse ngOnChanges
como desencadenante para volver a dibujar marcadores en un mapa de Google. El problema es que ngOnChanges no se dispara cuando hay rawLapsData
cambios 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.rawLapsData
es 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. lapsData
se actualiza porque tiene / es una referencia a la misma matriz que rawLapsData
.