私はこれについて最初に尋ねるのではないことを知っていますが、前の質問で答えを見つけることができません。これは1つのコンポーネントにあります
<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マップでマーカーを再描画するためのトリガーとして使用する必要があります。問題はrawLapsData
、親の変更時にngOnChangesが発生しないことです。私に何ができる?
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
ます。