Хобрук: Ваш путь к мастерству в программировании

TypeError: не удается прочитать свойство undefined, но сайт работает точно - Angular 7

TypeError: Cannot read property 'city' of undefined

Мое приложение отлично отображается в браузере, но я получаю эту ошибку в консоли Chrome, которую я хотел бы понять / исправить. Консоль выдает ошибку 3 раза, обращаясь к файлу / строке CurrentWeatherComponent.html:3, которая равна <span>{{current.city}}, {{current.country}} </span>

если я удалю {{current.city}},, появится ошибка TypeError: Cannot read property 'country' of undefined Дело в том, что в браузере приложение действительно отображает current город, current страну, current дату и все другие свойства current. Поскольку ошибка выводится на консоль три раза, но затем отображается нормально, я предполагаю, что это связано с таймингом?

Ниже код для полноты. Дайте мне знать, если (и что) мне нужно опубликовать для более подробной информации.

HTML:

current-weather.component.html:
<div>
  <div>
    <span>{{current.city}}, {{current.country}} </span>
    <span>{{current.date | date:'fullDate'}}</span>
  </div>
  <div>
    <img [src]='current.image'>
    <span>{{current.temperature | number: '1.0-0'}}℉</span>
  </div>
  <div>
    {{current.description}}
  </div>
</div>

Компонент:

current-weather.component.ts
import { Component, OnInit } from '@angular/core'
import { ICurrentWeather } from '../interfaces'
import { WeatherService } from '../weather/weather.service'

@Component({
  selector: 'app-current-weather',
  templateUrl: './current-weather.component.html',
  styleUrls: ['./current-weather.component.css'],
})
export class CurrentWeatherComponent implements OnInit {
  current: ICurrentWeather

  constructor(private weatherService: WeatherService) {}

  ngOnInit() {
    this.weatherService
      .getCurrentWeather('Hilversum', 'NL')
      .subscribe(data => (this.current = data))
  }
}
19.12.2018

  • вы можете использовать ?, например {{current?.city}} 19.12.2018
  • @ABOS Да, это работает! Но это не кажется таким «элегантным»? 19.12.2018
  • в противном случае придется действовать более традиционным способом, например, {{current && current.city}}. 19.12.2018

Ответы:


1

До того момента, как функция weatherService.getCurrentWeather выдаст data, this.current будет undefined, и поэтому вы видите эти ошибки в консоли.

Вы можете использовать {{current?.city}} и сделать то же самое для всех других свойств current. Или вы можете подождать с визуализацией всех элементов, которые используют current, пока он не станет доступен, используя атрибут *ngIf:

<div *ngIf="current">
  <div>
    <span>{{current.city}}, {{current.country}} </span>
    <span>{{current.date | date:'fullDate'}}</span>
  </div>
  <div>
    <img [src]='current.image'>
    <span>{{current.temperature | number: '1.0-0'}}℉</span>
  </div>
  <div>
    {{current.description}}
  </div>
</div>
19.12.2018
  • определенно работает! Так что пока я воспользуюсь этим. Но все равно кажется, что это обходной путь. Разве нет элегантного способа сказать «подождите, пока данные не будут отправлены»? 19.12.2018
  • @ jbr870 В общем нет. В некоторых случаях может подойти канал async. 19.12.2018
  • Новые материалы

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..