要解决"Angular嵌套路由输出器的子级在路由动画完成之前消失"的问题,可以尝试以下解决方案:
routeReuseStrategy
来重用组件,以避免在路由切换时组件被销毁和重新创建。在你的路由模块中,可以将routeReuseStrategy
设置为AppRoutingCacheReuseStrategy
(自定义的路由重用策略):import { NgModule } from '@angular/core';
import { RouterModule, RouteReuseStrategy, DefaultUrlSerializer } from '@angular/router';
import { AppRoutingCacheReuseStrategy } from './app-routing-cache-reuse-strategy';
@NgModule({
imports: [RouterModule.forRoot(routes)],
providers: [
{
provide: RouteReuseStrategy,
useClass: AppRoutingCacheReuseStrategy
}
],
exports: [RouterModule]
})
export class AppRoutingModule { }
自定义的AppRoutingCacheReuseStrategy
可以参考以下示例代码:
import { RouteReuseStrategy, ActivatedRouteSnapshot, DetachedRouteHandle } from '@angular/router';
export class AppRoutingCacheReuseStrategy implements RouteReuseStrategy {
private handlers: { [key: string]: DetachedRouteHandle } = {};
shouldDetach(route: ActivatedRouteSnapshot): boolean {
return true;
}
store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
this.handlers[route.routeConfig.path] = handle;
}
shouldAttach(route: ActivatedRouteSnapshot): boolean {
return !!route.routeConfig && !!this.handlers[route.routeConfig.path];
}
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
if (!route.routeConfig) return null;
return this.handlers[route.routeConfig.path];
}
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
return future.routeConfig === curr.routeConfig;
}
}
*ngIf
指令来控制子级组件的显示和隐藏。
在父级组件的控制器中,可以定义一个showChildComponent
属性来控制子级组件的显示和隐藏,并在动画完成后设置其值为true
。
import { Component, OnInit } from '@angular/core';
import { trigger, state, style, animate, transition } from '@angular/animations';
@Component({
selector: 'app-parent-component',
template: `
`,
animations: [
trigger('yourAnimation', [
state('void', style({ opacity: 0 })),
state('*', style({ opacity: 1 })),
transition('void => *', animate('300ms')),
transition('* => void', animate('300ms'))
])
]
})
export class ParentComponent implements OnInit {
showChildComponent: boolean = false;
ngOnInit() {
// 模拟动画完成后显示子级组件
setTimeout(() => {
this.showChildComponent = true;
}, 300);
}
getState() {
return this.showChildComponent ? '*' : 'void';
}
}
这样,在路由切换时,子级组件将不会被销毁,直到动画完成后才会显示出来。
以上是解决"Angular嵌套路由输出器的子级在路由动画完成之前消失"的两种方法,你可以根据具体情况选择适合你的解决方案。