gpt4 book ai didi

路由前的 Angular 动画

转载 作者:行者123 更新时间:2023-12-02 17:05:51 29 4
gpt4 key购买 nike

在我当前的项目中,我试图摆脱 Angular 动画在路由时跳过的问题。在我的模板中,我在 css 网格布局中使用 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>

卡片出现时带有动画,但路由直接更改为下一条路由,无需等待动画。我还在过渡中的 query 中使用 animateChild() 进行了测试,但这没有帮助。如何让路由器等待它们?

谢谢,干杯!

最佳答案

当路由改变时,组件被销毁并且不能再被激活。如果您想在组件被销毁之前为其设置动画,您可以使用 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.

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

关于路由前的 Angular 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51763987/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com