Угловые анимации * ngIf непрозрачность работает только в одном направлении

#angular #angular-animations

#угловые #угловые анимации

Вопрос:

У меня возникла проблема с исчезновением и появлением сообщения об ошибке при использовании *ngIf. Затухание работает нормально, но затухание не работает. Вместо этого текст просто исчезает (как если бы для него было установлено значение display:none ), хотя *ngIf не вступает в силу до завершения исчезновения. Я пробовал конвертировать, чтобы использовать строковые перечисления и числовые значения, но получаю тот же эффект. Есть ли проблема с моей конфигурацией анимации?

Связанный stackblitz использует Angular 10, я использую Angular 11.0.7 (последнюю версию).

https://stackblitz.com/edit/angular-ivy-bsuupd?file=src/app/form-error.component.ts

 @Component({
  selector: "app-form-error",
  animations: [
    trigger("fadeInOut", [
      state("false", style({ opacity: 0 })),
      state("true", style({ opacity: 1 })),
      transition("true <=> false", animate(500))
    ])
  ],
  template: `
    <p>showError is {{ showError }}</p>
    <p>fadeError is {{ fadeError }}</p>
    <ng-container *ngIf="showError">
      <h1 [@fadeInOut]="{ value: fadeError }">{{ errorText }}</h1>
    </ng-container>
  `
})
export class FormErrorComponent implements OnInit, OnChanges {
  @Input() errorText: string;
  showError: boolean = false;
  fadeError: boolean = false;

  constructor() {}

  ngOnInit(): void {}

  ngOnChanges(changes: SimpleChanges): void {
    if (this.errorText) {
      this.showError = true;
      setTimeout(() => {
        // lets fade in begin after ngIf takes effect (works fine)
        this.fadeError = true;
      });
    } else {
      this.fadeError = false; // this should start fade, but just hides the text immediately
      setTimeout(() => {
        // delays the ngIf until fade out is done
        this.showError = false;
      }, 500);
    }
  }
}
 

Ответ №1:

Проблема в том, что вы полностью удаляете текст, выполняя:

  this.errorMessage = null;
 

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

Вы можете понять, что я имею в виду, посмотрев на это:
https://stackblitz.com/edit/angular-ivy-t3ft5x?file=src/app/hello.component.ts

Я просто лечу 'test' так, как вы лечите null


В качестве решения вы можете использовать установщик для текста и логический флаг как:

   errorTextToShow: string;
  showErrorText: boolean;
  @Input() set errorText(value: string) {
    if(!!value){
      this.errorTextToShow = value;
    }
    this.showErrorText = !!value;
  }
 

и в вашем шаблоне есть:

   <h1 [@fadeInOut]="{ value: fadeError }">{{ errorTextToShow }}</h1>
 

Таким образом, чтобы добиться того, чего вы хотели, и не удалять текст при установке для ввода значения null, чтобы эффект затухания все еще мог присутствовать.

Вы можете ознакомиться с решением здесь:
https://stackblitz.com/edit/angular-ivy-fwpgcw?file=src/app/form-error.component.ts

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

1. Вы правы! Все это время я был сосредоточен на настройках анимации, а не на контенте. Я изменил свою систему (более сложную, чем stackblitz), чтобы удерживать сообщение об ошибке, пока оно не исчезнет, и это сработало. Спасибо!

2. Рад, что смог помочь 🙂 , да, это случается со мной тоже постоянно, иногда вы так сосредотачиваетесь на том, что считаете самым сложным аспектом, и забываете, что вокруг него, и все, что нужно, это взглянуть с немного другой точки зрения