Очень неинтуитивная непредвиденная ошибка закрывающего тега в действительном шаблоне

Это мой первый день изучения angular, и я столкнулся с очень неинтуитивным сообщением об ошибке, в котором говорится:

Неперехваченная ошибка: ошибки синтаксического анализа шаблона: неожиданный закрывающий тег "p". Это может произойти, когда тег уже закрыт другим тегом. Для получения дополнительной информации см. https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags ("Номер {{ i + 1 }}: {{ phoneNumber }} [ ОШИБКА ->]

"): ng:///AppModule/AddressCardComponent.html@5:0

Ошибка выдается в действительном HTML-шаблоне, который выглядит следующим образом:

<p>Phones:</p>
<p *ngFor="let phoneNumber of user.phone; index as i">
  <h3>
      Number {{ i + 1 }}: {{ phoneNumber }}
  </h3>
</p>

а в самом компоненте это выглядит так:

@Component({
  selector: 'app-address-card',
  templateUrl: './address-card.component.html',
  styleUrls: ['./address-card.component.scss']
})
export class AddressCardComponent implements OnInit {

  user: any;

  constructor() {
    this.user = {
      name: 'Foo Bar',
      title: 'Software Developer',
      address: '1234 Main St., State, City 610010',
      phone: [
        '123-123-1234',
        '456-546-4574'
      ]
    }
  }

  ngOnInit() {
  }

}

Круто то, что если я изменяю внутренний тег h3 на span или a, он работает идеально, как и ожидалось, тогда как когда внутренний тег p, h3, h2, h1, div и т. д., он просто ломается с той же ошибкой.

Похоже, ему просто не нравятся определенные теги, лол


Так или иначе,

  1. Я делаю что-то не так здесь? Если да, то как мне исправить шаблон? Что мне не хватает?

  2. Много ли ситуаций, когда при разработке угловых приложений появляется так много неинтуитивных сообщений об ошибках?


PS: я использую Angular v7.0.5, если это имеет значение.


person Denis Yakovenko    schedule 10.11.2018    source источник
comment
Прочитайте это. У вас не может быть тега h1 внутри тега p   -  person user184994    schedule 10.11.2018
comment
@user184994 user184994 Что ж, браузеры отображают такие вещи, даже если они не соответствуют стандартам. Тогда другой вопрос: действительно ли angular должен говорить мне, какие теги использовать? да еще и с такими расплывчатыми сообщениями об ошибках... Как-то странно   -  person Denis Yakovenko    schedule 10.11.2018
comment
Я бы сказал, что это не так расплывчато. Он сообщает вам, какой именно тег вызывает ошибку, и ссылку на спецификацию w3, которая показывает причину. Браузер автоматически вставит закрывающий тег p, как только дойдет до вашего h1, так что теперь у вас есть исходный закрывающий тег без соответствующего открывающего тега.   -  person user184994    schedule 10.11.2018
comment
Да я вижу. Спасибо, ребята, эта тема была новой для меня. Я думаю, что мне нужно некоторое время с angular, чтобы привыкнуть к нему.   -  person Denis Yakovenko    schedule 10.11.2018


Ответы (1)


Для проверки HTML 5 теги заголовков не могут находиться внутри тегов абзаца. Я подозреваю, что ваш код также будет работать нормально, если вы замените <p *ngFor="let phoneNumber of user.phone; index as i"> на <div *ngFor="let phoneNumber of user.phone; index as i">.

Я обнаружил, что Angular часто действительно заставляет вас делать что-то правильно. С их точки зрения, есть стандарт, и на то есть причина. Таким образом, даже если технически код работает, существуют потенциальные побочные эффекты, которые могут возникнуть в другом месте. И те, те могут быть полной PITA, чтобы найти. Таким образом, они подталкивают вас к правильному пути в самой основе. Это, вероятно, большая часть причины того, что Angular имеет крутую кривую обучения. Это подвергает сомнению все, что, как вам кажется, вы уже знаете.

Некоторые сообщения об ошибках Angular могут быть немного... расплывчатыми. Но я думаю, что с самого начала я боролся с ошибками JS не меньше.

person Bytech    schedule 10.11.2018
comment
Ну да, ты прав. Но мне все еще кажется немного странным, что angular говорит мне, какие теги использовать и где их использовать. По крайней мере, они должны были выдать соответствующее сообщение об ошибке... - person Denis Yakovenko; 10.11.2018
comment
Я обновил свой ответ, чтобы лучше ответить на весь набор ваших вопросов. :) - person Bytech; 10.11.2018
comment
Вы также можете заменить на ‹ ng-container *ngFor=...›‹ p›..‹ /p›‹ /ng-container› - person Eliseo; 10.11.2018