html - angular - animația rutei se declanșează doar la reîmprospătarea paginii


Am o situație în care animația pe care am configurat-o pentru rute se declanșează doar când pagina browser-ului este reîncărcată. Când navighez la rute diferite în aplicație, animațiile nu sunt aplicate.

Acesta este router-animations.ts al meu:

import {
    trigger,
    transition,
    style,
    animate,
    state 
} from '@angular/animations';

export function slideLeft() {
    return slide();
}

function slide() {
    return trigger('slide', [
        state('void', style({ position: 'absolute', width: '100%' })),
        state('*', style({ position: 'absolute', width: '100%' })),
        transition('void => *', [
            style({ transform: 'translateX(100%)', opacity: 0 }),
            animate(
                '1s ease-in-out',
                style({ transform: 'translateX(0%)', opacity: 1 })
            ),
        ]),
        transition('* => void', [
            style({ transform: 'translateX(0%)', opacity: 1 }),
            animate(
                '1s ease-in-out',
                style({ transform: 'translateX(-100%)', opacity: 0 })
            ),
        ]),
    ]);
}

Fișierul meu app.component.html:

<div [@slide]="prepareRoute(outlet)" >
    <router-outlet #outlet="outlet"></router-outlet>
</div>

app.component.ts:

import { slideLeft } from './router-animations'

@Component({
  selector: 'app-root',
  animations: [slideLeft()],
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})

export class AppComponent {
  title = 'ShopCompanionApp';

  prepareRoute(outlet: RouterOutlet) {
      return outlet && outlet.activatedRouteData && outlet.activatedRouteData['animation'];
  }
}

În cele din urmă, iată rutele mele:

const appRoutes: Routes = [
    { path: "", component: LoginShopComponent },
    { path: "login/store", component: LoginShopComponent },
    { path: "login/account", component: LoginAccountComponent },
    { path: "mystore/manage", component: SlotsManagementComponent, canActivate: [AuthGuard] },
    { path: "mystore/orders", component: OrdersComponent, canActivate: [AuthGuard] },
    { path: "mystore/orders/:id", component: OrderDetailsComponent, canActivate: [AuthGuard] },
    { path: "**", redirectTo: "mystore/manage", pathMatch: "full" }
]

Ce îmi scapă aici?

Mulțumesc anticipat.

Răspuns #1

Nu sunt 100% sigur cu privire la specificații, dar ai putea încerca să asculți pentru schimbările de rută și să aplici animația dacă URL-ul corespunde criteriilor tale.

Am eliminat prepareRoute și l-am înlocuit cu o variabilă shouldSlide în schimb.

<div [@slide]="shouldSlide" >
    <router-outlet #outlet="outlet"></router-outlet>
</div>
import { Router, NavigationEnd } from '@angular/router';
export class AppComponent {
  title = 'ShopCompanionApp';
  shouldSlide = false;

  constructor(private router: Router) {
    router.events.subscribe((evt) => { // will trigger each time there's a route change.
      if(evt instanceof NavigationEnd){
        this.shouldSlide = evt.url.match('animation');
      }
    });
  }
  
  // TODO unsubscribe when the component is destroyed
}