Свойство @Input() в угловом компоненте возвращает пустой массив

У меня есть компонент календаря со свойством данных, оформленным как @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.info(this.data);
    console.info(changes.data);
  }
}

Я передаю данные из другого компонента следующим образом:

<app-calendar [data] = "this.calendarData"></app-calendar>

И переданные данные обрабатываются *ngFor в компоненте календаря (отрисовываются отлично, и все работает нормально):

<div *ngFor = "let item of data">{{item.date}}</div>

Я хочу сначала проанализировать эти данные, прежде чем отображать их в представлении, и всякий раз, когда я пытаюсь использовать свойство данных console.info в компоненте календаря, я получаю странный массив, он отображается как пустой, я могу «открыть» его из консоли браузера:

Свойство @Input() в угловом компоненте возвращает пустой массив.

И когда я пытаюсь записать такое значение:

console.info(this.data[0])

или

console.info(changes.data.currentValue[0])

я получаю undefined значение.

Вы пытались удалить инициализацию из конструктора? Это не должно быть там. Вам следует избегать добавления в конструктор чего-либо, кроме внедрения зависимостей.

Will Alexander 29.05.2019 21:28

Пожалуйста, попробуйте создать минимальный воспроизводимый пример, я рекомендую stackblitz.com

Igor 29.05.2019 21:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
2 211
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Удалите this.data = [] из конструктора, избегайте каких-либо изменений при использовании инъекции зависимостей.

И используйте set и get для каждого Input(), который вы хотите использовать в своем шаблоне, это лучшая практика.

  private _data: CalendarDay[];

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

  get data(): CalendarDay[] {
    return this._data;
  }

И в вашем HTML вы должны передать его с помощью:

<app-calendar [data] = "calendarData"></app-calendar>

В компоненте календаря вы можете использовать с

<div *ngFor = "let item of data">{{item.date}}</div>

Другие вопросы по теме