Je sais que je ne suis pas le premier à poser des questions à ce sujet, mais je ne trouve pas de réponse dans les questions précédentes. J'ai ceci dans un composant
<div class="col-sm-5">
<laps
[lapsData]="rawLapsData"
[selectedTps]="selectedTps"
(lapsHandler)="lapsHandler($event)">
</laps>
</div>
<map
[lapsData]="rawLapsData"
class="col-sm-7">
</map>
Dans le contrôleur rawLapsdata
est muté de temps en temps.
Dans laps
, les données sont sorties au format HTML dans un format tabulaire. Cela change chaque fois que cela rawLapsdata
change.
Mon map
composant doit être utilisé ngOnChanges
comme déclencheur pour redessiner des marqueurs sur une carte Google. Le problème est que ngOnChanges ne se déclenche pas lors des rawLapsData
modifications du parent. Que puis-je faire?
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();
}
Mise à jour: ngOnChanges ne fonctionne pas, mais il semble que lapsData soit mis à jour. Dans le ngInit se trouve un écouteur d'événements pour les modifications de zoom qui appelle également this.drawmarkers
. Lorsque je change de zoom, je constate en effet un changement de marqueurs. Le seul problème est que je ne reçois pas la notification au moment où les données d'entrée changent.
Dans le parent, j'ai cette ligne. (Rappelez-vous que le changement se reflète dans les tours, mais pas sur la carte).
this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);
Et notez que this.rawLapsData
c'est lui-même un pointeur vers le milieu d'un grand objet json
this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
zone.run(...)
devrait le faire alors.
ngOnChanges()
ne sera pas appelé. Vous pouvez utiliser ngDoCheck()
et implémenter votre propre logique pour déterminer si le contenu du tableau a changé. lapsData
est mis à jour car il a / est une référence au même tableau que rawLapsData
.