我正在开发的应用程序需要具备通过路由前进和后退的能力,因此当您以一定方向通过应用程序导航时,组件会从左到右进行动画,而当您返回时,它们将从右到左进行导航。
即:
component1 -> component2 = left -> right animation
component2 -> component1 = right -> left animation
我可以在NG4中轻松实现这一点,但问题是它不能同时导航退出和进入组件。退出组件只会消失,进入组件则会动画显示。
我也可以在NG2中实现这个目标 - 但当你有条件动画时就会变得复杂。例如:
component2 -> component3 = left -> right animation
component2 -> component1 = right -> left animation
问题在于根据下一个或上一个路由触发不同的动画。
有人有解决方案吗?无论是NG2还是4,解决同时在任何方向上都动画化两个视图的问题?
我没有把这个放在plunkr上,因为我不知道如何在那里设置一个NG4应用程序。抱歉。
我的NG4解决方案基于this demo apphttps://github.com/matsko/ng4-animations-preview,但基本上在我的app.component.ts中,我有以下动画:
animations: [
trigger('routerAnimations',[
transition('page1 => page2',[
style({transform: 'translateX(100%)'}),
animate('500ms')
]),
transition('page2 => page1', [
style({transform: 'translateX(-100%)'}),
animate('500ms')
]),
transition('page2 => page3',[
style({transform: 'translateX(100%)'}),
animate('500ms')
]),
transition('page3 => page2',[
style({transform: 'translateX(-100%)'}),
animate('500ms')
]),
transition('page3 => page4',[
style({transform: 'translateX(100%)'}),
animate('500ms')
]),
transition('page4 => page3',[
style({transform: 'translateX(-100%)'}),
animate('500ms')
])
])
]
还需要一个函数,从每个路由中获取动画值并将其绑定到app.component.html
中的<router-outlet>
变量上:
export class AppComponent {
prepareRouteTransition(outlet) {
let routeData: any;
try {
routeData = outlet['_activatedRoute'].snapshot.routeConfig['animation'];
} catch(e) {
return '';
}
return routeData.value;
}
}
上面的函数获取动画值,该值用于动画中定义过渡的起始和结束值:
export const APP_ROUTES = [{
path: '',
component: Page1Component,
animation: {
value: 'page1',
}
},
{
path: 'page2',
component: Page2Component,
animation: {
value: 'page2',
}
},
{
path: 'page3',
component: Page3Component,
animation: {
value: 'page3'
}
},
{
path: 'page4',
component: Page4Component,
animation: {
value: 'page4'
}
}
];
app.component.html:
<div class="page" [@routerAnimations]="prepareRouteTransition(outlet)">
<router-outlet #outlet="outlet"></router-outlet>
</div>