Angular2 change detection: ngOnChanges nicht feuern für verschachtelte Objekt

Ich weiß, ich bin nicht die erste, danach zu Fragen, aber ich kann nicht finden, eine Antwort auf die vorherigen Fragen. Ich habe dies in einer Komponente

<div class="col-sm-5">
    <laps
        [lapsData]="rawLapsData"
        [selectedTps]="selectedTps"
        (lapsHandler)="lapsHandler($event)">
    </laps>
</div>

<map
    [lapsData]="rawLapsData"
    class="col-sm-7">
</map>

In der Steuerung rawLapsdata bekommt mutiert von Zeit zu Zeit.

In laps, die Ausgabe der Daten erfolgt als HTML in einem tabellarischen format. Dies ändert sich, wenn rawLapsdata änderungen.

Meine map Komponente verwenden muss ngOnChanges als trigger neu zu zeichnen, Marker auf einer Google-Karte. Das problem ist, dass ngOnChanges nicht ausgelöst wird, wenn rawLapsData änderungen in der übergeordneten. Was kann ich tun?

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();
    }

Update: ngOnChanges nicht funktioniert, aber so wie es aussieht lapsData aktualisiert wird. In der ngInit ist ein Ereignis-listener für die zoom-änderungen, auch Anrufe this.drawmarkers. Wenn ich den zoom ändern ich sehe schon eine Veränderung in Marker. Also, das einzige Problem ist, dass ich don ' T erhalten die Mitteilung zum Zeitpunkt der input-Daten ändern.

In der Elternteil, habe ich diese Linie. (Recall, dass die änderung in Runden, aber nicht in der Karte).

this.rawLapsData = deletePoints(this.rawLapsData, this.selectedTps);

Und beachten Sie, dass this.rawLapsData selbst ist ein Zeiger auf die Mitte einer großen json-Objekt

this.rawLapsData = this.main.data.TrainingCenterDatabase.Activities[0].Activity[0].Lap;
Ihr code wird nicht angezeigt, wie die Daten aktualisiert werden oder welche Art der Daten ist. Ist eine neue Instanz zugewiesen oder ist das nur eine Eigenschaft der Wert geändert wurde?
Ich fügte hinzu, die Zeile aus der übergeordneten Komponente
Ich denke, wickeln Sie diese Zeile in zone.run(...) sollte es dann tun.
Array (Verweis) ist nicht zu ändern, so ngOnChanges() werden nicht genannt. Sie können ngDoCheck() und Umsetzung Ihrer eigenen Logik, um zu bestimmen, ob die array-Inhalte haben sich geändert. lapsData aktualisiert wird, weil es hat/wird eine Referenz auf das selbe array wie rawLapsData.
1) In der Runden Komponente Ihr code/template durchläuft jeden Eintrag in der lapsData array und zeigt den Inhalt, also gibt es Winkel-Bindungen auf jedes Stück von Daten, die angezeigt wird. 2) Auch wenn die Winkel nicht alle änderungen erkennen (referenzprüfung) zur Eingabe einer Komponente Eigenschaften, die es noch werden (standardmäßig) prüft alle von der template-Bindungen. Das ist, wie Runden-picks bis auf die änderungen. 3) Die Karten-Komponente wahrscheinlich keine Bindungen in seiner Vorlage seiner lapsData input-Eigenschaft, richtig? Das würde die Differenz erklären.

InformationsquelleAutor Simon H | 2016-01-14

Schreibe einen Kommentar