* ngIf не переключается обратно на false в блоке else

#javascript #angular #angular-ng-if

#javascript #угловой #angular-ng-if

Вопрос:

Я использую Angular7, npm 6.4.1, узел 10.15.3.

Я просто играю с ngIf, это не делает ничего полезного. Я использую две кнопки для переключения между отображением и скрытием заголовка. Хотя это было просто ngIf утверждение, оно отлично работало со следующим кодом:

     <p>Do you want to see the last header?</p>
    <button (click)="yesHeader()">Yes please!</button>
    <button (click)="noHeader()">PLEASE G-D NO!</button>

    <h2 *ngIf="displayHeader" style="color:blue">Here it is in all its glory!</h2>
 

и

 public displayHeader=false;

  yesHeader(){
    this.displayHeader=true
  }

  noHeader(){
    this.displayHeader=false
  }
 

И это сработало нормально, показывая заголовок при нажатии yesHeader кнопки и скрывая его снова при нажатии noHeader кнопки.

Однако, когда я добавил блок ngIf Else, он перестал переключаться взад и вперед. Изменение было следующим:

     <p>Do you want to see the last header?</p>
    <button (click)="yesHeader()">Yes please!</button><button (click)="noHeader()">NO! NO!</button>

    <h2 *ngIf="displayHeader; else noHeader" style="color:blue">Here it is in all its glory!</h2>

    <ng-template #noHeader>
      <h5>You don't know what you're missing!</h5>
    </ng-template>
 

Теперь он отображается You don't know what you're missing! при запуске и переключается на заголовок, если я нажимаю «Да». Но он не переключается обратно на скрытие заголовка, если я нажму кнопку no после этого.

Что я делаю не так и как я могу заставить его переключиться обратно?

В качестве дополнительной точки данных, если я оставлю блок else, но else noHeader выну из оператора ngIf, он все равно не переключится обратно. Таким образом, по-видимому, существование ng-template — это то, что останавливает работу.

Ответ №1:

Проблема в том , что существует конфликт имен noHeader . Он используется в вашем примере как метод в классе компонента, так и имя компонента ng-template . Попробуйте изменить либо имя метода, либо имя шаблона:

 <p>Do you want to see the last header?</p>
<button (click)="yesHeader()">Yes please!</button><button (click)="noHeader()">NO! NO!</button>

<h2 *ngIf="displayHeader; else noHeaderTemplate" style="color:blue">Here it is in all its glory!</h2>

<ng-template #noHeaderTemplate>
  <h5>You don't know what you're missing!</h5>
</ng-template>
 

Вот пример в действии.

Комментарии:

1. Не могу дать чек, пока мой q не станет достаточно взрослым.

Ответ №2:

Ваш шаблон вызывается так же , как и функция: noHeader .

У вас проблема с коллизией имен, вы не можете вызвать noHeader функцию, Angular думает, что вы ссылаетесь noHeader на ссылку на шаблон.

 <ng-template #noHeaderTemplate>
  <h5>You don't know what you're missing!</h5>
</ng-template>
 

Или

 hideHeader() {
  this.displayHeader = false;
}
 

Правильная среда разработки должна сообщить вам, что «Участник noHeader не вызывается».