Угловой переход маршрута — Слайд влево или вправо в зависимости от текущего маршрута?

#angular #animation #angular-routing #angular-animations

#угловой #Анимация #угловой-маршрутизация #angular-анимации

Вопрос:

Я следовал этому руководству, чтобы добавить анимацию перехода маршрута, и, похоже, это работает, но в моем приложении более 3 маршрутов. Теперь, когда я перехожу на страницу с animation: 'isRight' когда я нахожусь в данный момент isLeft , она работает как ожидалось, но когда я уже включен isRight и хочу перейти на другую страницу, которая находится справа от текущей, она вообще не показывает никакого перехода.

Как я могу сделать переход зависимым от того, где я нахожусь в данный момент? Как я узнаю, нужно ли мне делать переход влево или вправо?

Это пример для моих маршрутов:

 const routes: Routes = [
  { path: 'page1', component: Page1Component, data: {animation: isLeft} },
  { path: 'page2', component: Page2Component, data: { animation: 'isRight' } },
  { path: 'page3', component: Page3Component, data: { animation: 'isRight' } },
  { path: 'page4', component: Page4Component, data: { animation: 'isRight' } },
  { path: 'page5', component: Page5Component, data: { animation: 'isRight' } },
  { path: 'page6', component: Page6Component, data: { animation: 'isRight' } },
];

  

Это моя анимация:

 export const slider =
    trigger('routeAnimations', [
        transition('* => isLeft', slideTo('left')),
        transition('* => isRight', slideTo('right')),
        transition('isRight => *', slideTo('left')),
        transition('isLeft => *', slideTo('right'))
    ]);

function slideTo(direction) {
    const optional = { optional: true };
    return [
        query(':enter, :leave', [
            style({
                position: 'absolute',
                top: 0,
                [direction]: 0,
                width: '100%'
            })
        ], optional),
        query(':enter', [
            style({ [direction]: '-100%'})
        ]),
        group([
            query(':leave', [
                animate('600ms ease', style({ [direction]: '100%'}))
            ], optional),
            query(':enter', [
                animate('600ms ease', style({ [direction]: '0%'}))
            ])
        ]),
        // Normalize the page style... Might not be necessary

        // Required only if you have child animations on the page
        query(':leave', animateChild()),
        query(':enter', animateChild()),
    ];
}
  

Ответ №1:

Это легко сделать со значениями селектора перехода :increment и :decrement . Вы можете определить маршруты с каждым маршрутом, имеющим animation свойство набора данных в числовое значение в порядке возрастания, как показано ниже —

 const routes: Routes = [
  { path: 'one', component: CompOneComponent, data: { animation: 0 } },
  { path: 'two', component: CompTwoComponent, data: { animation: 1 } },
  { path: 'three', component: CompThreeComponent, data: { animation: 2 } },
  { path: 'four', component: CompFourComponent, data: { animation: 3} },
];
  

Тогда ваш transitions должен быть похож —

 trigger('routeAnimations', [
  transition(':increment', slideTo('right') ),
  transition(':decrement', slideTo('left') ),
]);
  

Посмотрите на этот пример stackblitz. Пожалуйста, также обратитесь к этому документу angular для получения всех подробностей.

Комментарии:

1. Спасибо, это именно то, что я искал.

2. добавьте стиль ({position: ‘relative’}) перед первым запросом (), если ваш слайдер заставляет компоненты перемещаться вверх / вниз, кстати

3. Идеально завершает решение операционной системы.