Я знаю, что не первый, кто спрашивает об этом, но не могу найти ответа в предыдущих вопросах. У меня это в одном компоненте
<div class="col-sm-5">
<laps
[lapsData]="rawLapsData"
[selectedTps]="selectedTps"
(lapsHandler)="lapsHandler($event)">
</laps>
</div>
<map
[lapsData]="rawLapsData"
class="col-sm-7">
</map>
В контроллере rawLapsdata
время от времени происходит мутация.
В laps
, данные выводятся как HTML в табличном формате. Это меняется всякий раз, когда rawLapsdata
меняется.
Мой map
компонент нужно использовать ngOnChanges
в качестве триггера для перерисовки маркеров на карте Google. Проблема в том, что ngOnChanges не срабатывает при rawLapsData
изменении родительского объекта . Что я могу сделать?
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();
}
Обновление: ngOnChanges не работает, но похоже, что lapsData обновляется. В ngInit есть прослушиватель событий для изменения масштаба, который также вызывает this.drawmarkers
. Когда я меняю масштаб, я действительно вижу изменение маркеров. Так что единственная проблема в том, что я не получаю уведомления в момент изменения входных данных.
В родителе у меня эта строчка. (Напомним, изменение отражается на кругах, но не на карте).
this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);
Обратите внимание, что this.rawLapsData
это указатель на середину большого json-объекта.
this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
zone.run(...)
должно сделать это тогда.
ngOnChanges()
не будет вызываться. Вы можете использовать ngDoCheck()
и реализовать свою собственную логику, чтобы определить, изменилось ли содержимое массива. lapsData
обновляется, потому что он имеет / является ссылкой на тот же массив, что и rawLapsData
.