угловая анимация: компонент уничтожается до запуска анимации

#angular #animation

Вопрос:

Я пытаюсь запустить анимацию из popin.component.ts, которые управляют представлением.

 import { Component, EventEmitter, Input, Output } from "@angular/core";
import {
  trigger,
  state,
  style,
  animate,
  transition
} from "@angular/animations";

@Component({
  selector: "app-popin",
  templateUrl: "./popin.component.html",
  styleUrls: ["./popin.component.css"],
  animations: [
    trigger("openClose", [
      state(
        "open",
        style({
          transform: "translateY(0%)"
        })
      ),
      state(
        "closed",
        style({
          transform: "translateY(100%)"
        })
      ),
      transition("* => *", animate(500))
    ])
  ]
})
export class PopinComponent {
  @Input() isPopinOpen = false;
  @Input() isPopinAnimationActive = false;
  @Output() isPopinClosed = new EventEmitter<boolean>();

  closePopin() {
    this.isPopinClosed.emit(this.isPopinAnimationActive);
  }
}

 

Родительский компонент управляет логическим значением для изменения состояния.

 import { Component } from "@angular/core";

@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  isPopinAnimationActive: boolean;
  isPopinOpen: boolean;
  animate() {
    this.isPopinOpen = true;
    this.isPopinAnimationActive = true;
  }

  closeThePopin() {
    this.isPopinOpen = false;
    this.isPopinAnimationActive = false;
  }
}
 

У меня есть 2 проблемы.

1 — когда я закрываю всплывающее окно, анимация для скольжения вниз не работает. Это работает только в том случае, если я удалю строку в комментарии.

   closeThePopin() {
    // this.isPopinOpen = false;
    this.isPopinAnimationActive = false;
  }
 

2 — Похоже, что angular не считывает состояние для перехода «открыто» и «закрыто»

 transition("open => closed", animate(500))
 

Это работает только тогда, когда я использую * вот так:

 transition("* => *", animate(500))
 

вот код codesandbox:

https://codesandbox.io/s/lucid-wilson-lqzw2?file=/src/app/app.component.ts

Ответ №1:

вам нужно «поиграть» с обратным вызовом анимации или использовать :введите и :оставьте псевдонимы. Примите во внимание, что если *ngIf у вас есть если ложно, то анимировать невозможно.

Использование анимации обратного вызова-это изменение нескольких ваших всплывающих компонентов

 <div class="container" *ngIf="isPopinOpen " (click)="isPopinAnimationActive=false">
  <div class="popin" (@openClose.done)="!isPopinAnimationActive amp;amp; closePopin()" 
       [@openClose]="isPopinAnimationActive ? 'open': 'closed'">
    content
  </div>
</div>
 

Видите, что click() единственное изменение переменной «isPopinAnimationActive»

В (@openClose.done) где, если isPopinAnimationActive=false, выполните функцию «closePopin ()», чтобы вызвать событие.

Я использую метод «абревиатуры» "condition amp;amp; myFunction()" . Если условие истинно, функция выполняется, если условие ложно, функция не выполняется.

Использование :введите и :оставьте разрешить анимацию компонентов под *ngIf

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

1. Спасибо тебе, @Eliseo ! теперь это работает на меня. И это исправило проблему, связанную с переходом от «открытого» к «закрытому», но это не работает от «закрытого» к «открытому», Связано ли это с отсутствием использования методов обратного вызова ? « переход(«закрыт => открыт», анимация(«3750 мс для облегчения»)), переход(«открыт =>> закрыт», анимация(«2750 мс для облегчения»)), «

Ответ №2:

В вашем popin.component.html файл, который вы используете *ngIf="isPopinOpen" для отображения/скрытия div. В том же div вы вызываете closePopin() функцию при click событии.

Таким образом, каждый раз, когда вы нажимаете на div, переменная isPopinOpen изменяется на false, что скрывает div, содержащий анимационный контент.

1 — когда я закрываю всплывающее окно, анимация для скольжения вниз не работает. Это работает только в том случае, если я удалю строку в комментарии.

Анимация для скольжения вниз работает отлично. Вы не можете видеть анимацию, потому что, как только вы нажимаете на div, этот div скрывается, потому что isPopinOpen = false

Чтобы решить проблему, вам нужно использовать setTimeout функцию на closeThePopin() функции в файле app.component.ts или на closePopin() функции в файле popin.component.ts, но не в обеих функциях.

Я добавил setTimeOut функцию в функцию файла app.component.ts closeThePopin()

 closeThePopin() {
    // Added
    setTimeout(() => {
      this.isPopinOpen = false;
    }, 1000);
    this.isPopinAnimationActive = false;
}
 

Пример рабочего кода: CodeSandbox