Я довольно новичок в Angular 2, и я хочу передать массив, сделанный в родительском компоненте, через @Input(), его дочернему элементу.Преобразует ли массив объект после @Input() в дочерний?
В родительском я создаю массив, добавляю данные из службы и отображаю его в консоли (выход консоли 1). В дочернем компоненте я затем использую ngOnChanges, чтобы снова отобразить его в консоли (вывод консоли 2). Как вы можете видеть ниже, длина массива изменяется от 12 до 0. Я полагаю, это связано с тем, что массив переходит к объекту, когда он передается ребенку?
Как бы исправить это?
Родитель
import { Component, OnInit } from '@angular/core';
import { Module, MapMarkerData } from './coreclasses';
import { TimelineService } from './input.service';
@Component({
selector: 'my-app',
templateUrl: 'app/app.component.html',
providers: [TimelineService]
})
export class AppComponent implements OnInit {
modules: Module[];
mapMarkerData: any;
constructor(private timelineService: TimelineService) {
this.mapMarkerData = new Array<MapMarkerData>();
}
getModules(): void {
this.timelineService.getModules().then(modules => {this.modules = modules; this.setMapModuleData(this.modules);});
}
setMapModuleData(modules: Array<any>): void {
for (let module of modules) {
if (module.className) {
var id = module.id;
var className = module.className;
let contents: Object = {id: id, className: className};
this.mapMarkerData.push(contents);
}
}
console.log(this.mapMarkerData); // CONSOLE OUTPUT 1
console.log(this.mapMarkerData.length);
}
}
Детский
import { Component, Input, OnInit, OnChanges, SimpleChanges } from '@angular/core';
import { MapMarkerData } from './coreclasses';
@Component({
selector: 'timeline-map',
templateUrl: 'app/timeline.map.component.html'
})
export class TimelineMapComponent implements OnChanges {
@Input()
mapMarkerData: any;
ngOnChanges(changes: any) {
console.log(this.mapMarkerData); // CONSOLE OUTPUT 2
console.log(this.mapMarkerData.length);
}
}
Родитель Шаблон
...
<div id="map" class="mapLarge">
<timeline-map [mapMarkerData] = "mapMarkerData"></timeline-map>
</div>
...
Console Output 1 Array [12]: [Object, Object, ...]
Консоль Выход 2 Array [0]: [Object, Object, ...]
массив не изменяется, когда передается ребенку.Я подозреваю, что 'Console Output 2' печатается до' Console Output 1'. Разве это не так? –
изменение осуществляется с помощью 'changes.mapMarkerData.currentValue' – harshes53