Почему этот массив не определен и как это исправить? - PullRequest
0 голосов
/ 20 мая 2019

У меня проблема с моим кодом. Это говорит о том, что мой массив не определен, но позже он работает нормально. Вот код:

books: IBook[] = [];
[...]
  ngOnInit() {
    this.service.getEmployees().subscribe(
      (listBooks) => this.books = listBooks,
      (err) => console.log(err)
    ); 
  }
[...]
 events: CalendarEvent[] = [
    {
      start: new Date(),
      end: new Date(),
      title: ""+this.books[0].device, //this.books[0] is undefined
      color: colors.yellow,
      actions: this.actions,
      resizable: {
        beforeStart: true,
        afterEnd: true
      },
      draggable: true
    },
[...]
test(){                     //this method is linked to a button
  console.log(this.books[0]) //after clicking it works fine
}
[...]

Метод Test находится после массива, где он говорит, что он 'undefined', поэтому он не может быть неопределенным, не так ли?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Где вы делаете это в своем коде? :

 events: CalendarEvent[] = [
    {
      start: new Date(),
      end: new Date(),
      title: ""+this.books[0].device, //this.books[0] is undefined
      color: colors.yellow,
      actions: this.actions,
      resizable: {
        beforeStart: true,
        afterEnd: true
      },
      draggable: true
    },
[...]

Если этот код находится в методе ngOnInit, вы должны поместить его в обратный вызов подписки следующим образом:

 ngOnInit() {
    this.service.getEmployees().subscribe(
      (listBooks) => {
         this.books = listBooks
         [...]
         events: CalendarEvent[] = [
        {
          start: new Date(),
          end: new Date(),
          title: ""+this.books[0].device, //this.books[0] is undefined
          color: colors.yellow,
          actions: this.actions,
          resizable: {
          beforeStart: true,
          afterEnd: true
         },
         draggable: true
        },
        [...]
      },
      (err) => console.log(err)
    ); 
  }

Вызов getEmployees является асинхронным, что означает, что объект событий может быть инициализирован перед функцией обратного вызова, где инициализируется объект books. Надеюсь, это ясно

0 голосов
/ 20 мая 2019

Прежде всего getEmployees(), работающий в ngOnInit, является асинхронным.Браузер продолжает выполнять назначение events синхронно, но listBooks будет разрешен из вызова в какой-то момент позже.

Поэтому вы должны исправить логику и инициализировать events после того, как ваши данные разрешены и, возможно, обработатьта информация, которую вы ожидаете в случае, если она не определена:

title: this.books[0] ? ""+this.books[0].device : ""

Наконец, вам нужна неизменная операция на books, когда вы хотите назначить новые данные:

this.books  = [...listBooks]
...