布线前的角动画

时间:2018-08-09 09:55:19

标签: angular animation angular-routing angular-animations

在我当前的项目中,我试图摆脱布线时跳过的Angular动画。在我的模板中,我想通过css-grid布局中的 mat-card mat-card 获得不同的“小配件”。

我在子组件(路线指向)中的动画看起来像

animations: [
  trigger('cardAnimation', [
    state('void', style({ opacity: 0, transform: 'scale(0.5)' })),
    state('*', style({ opacity: 1, transform: 'scale(1)' })),
    transition('void => *', animate('500ms ease-in')),
    transition('* => void', animate('500ms ease-in'))
  ])
]

简化的模板如下

<mat-card @cardAnimation>
</mat-card>

<mat-card @cardAnimation>
</mat-card>

卡片与动画一起出现,但是工艺路线直接更改为下一条路线,而无需等待动画。我还测试了转换中animateChild()内使用query的情况,但这无济于事。如何让路由器等待它们?

谢谢和欢呼!

1 个答案:

答案 0 :(得分:2)

当路线更改时,组件将被破坏并且无法再进行动画处理。如果要在销毁组件之前对其进行动画处理,可以使用CanDeactivate保护装置,以确保可以在销毁该组件之前将其停用。

这是一个实现示例:

export class CanDeactivateGuard implements CanDeactivate<CanComponentDeactivate> {
  canDeactivate(component: CanComponentDeactivate) {
    return component.canDeactivate ? component.canDeactivate() : true;
  }
}

然后在路由模块声明中:

RouterModule.forChild([
      { path: '', component: HelloComponent,
  canDeactivate: [CanDeactivateGuard] }
])

之后,您可以使用ngOnInitcanDeactivate来播放开始和结束动画:

ngOnInit() {
  this.animation = this._builder.build(this.slideIn(this.ANIMATION_TIME));
  this.player = this.animation.create(this.el.nativeElement, {});
  this.player.play();
}

canDeactivate() {
  this.animation = this._builder.build(this.slideOut(this.ANIMATION_TIME));
  this.player = this.animation.create(this.el.nativeElement, {});
  this.player.play();
  return timer(this.ANIMATION_TIME).pipe(mapTo(true)).toPromise();
}

Here is a running example with this suggested solution.

为了易于使用,我制作了一个抽象组件来处理动画,并通过简单地扩展抽象组件将动画行为添加到任何组件中。