角度组件中的@Input() 属性返回空数组

Rin*_*les 1 javascript typescript angular angular7

我有日历组件,其数据属性装饰为 @Input():

import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';

@Component({
  selector: 'app-calendar',
  templateUrl: './calendar.component.html',
  styleUrls: ['./calendar.component.css']
})
export class CalendarComponent implements OnInit, OnChanges {
  @Input() data: CalendarDay[];

  constructor() {
    this.data = [];
  }

  ngOnInit() {
    this.initDays();
  }

  ngOnChanges(changes: SimpleChanges) {
    console.log(this.data);
    console.log(changes.data);
  }
}
Run Code Online (Sandbox Code Playgroud)

我从另一个组件传入数据,如下所示:

<app-calendar [data]="this.calendarData"></app-calendar>
Run Code Online (Sandbox Code Playgroud)

并通过*ngFor日历组件呈现传递的数据(它呈现完美并且一切正常):

<div *ngFor="let item of data">{{item.date}}</div>
Run Code Online (Sandbox Code Playgroud)

我想先解析这些数据,然后再将它渲染到视图中,每当我尝试在日历组件中使用 console.log 数据属性时,我都会得到奇怪的数组,它显示为空,我可以从浏览器控制台“打开”它:

调用结果:console.log(changes.data.currentValue).

当我尝试记录这样的值时:

console.log(this.data[0])
Run Code Online (Sandbox Code Playgroud)

或者

console.log(changes.data.currentValue[0])
Run Code Online (Sandbox Code Playgroud)

我得到了undefined价值。

小智 5

this.data = []从构造函数中删除,避免在使用依赖注入时更改任何内容。

对于您想在模板中使用的每一个,使用setandget都是Input()最佳实践。

  private _data: CalendarDay[];

  @Input() set data(data: CalendarDay[]) {
    if(data) {
     this._data = data;
    }
  }

  get data(): CalendarDay[] {
    return this._data;
  }
Run Code Online (Sandbox Code Playgroud)

在你的 HTML 中,你应该传递它:

<app-calendar [data]="calendarData"></app-calendar>
Run Code Online (Sandbox Code Playgroud)

在日历组件中,您可以使用

<div *ngFor="let item of data">{{item.date}}</div>
Run Code Online (Sandbox Code Playgroud)