Пользовательская задняя анимация в угловом маршрутизаторе

Моя проблема в том, что у меня есть несколько страниц, которые используют routerTransition, поскольку его можно найти в нескольких местах (с использованием метода query(...)). Проблема в том, что я хотел бы иметь другую анимацию, когда мой компонент покидает или входит в нажатие кнопки «Назад» в браузере. Чтобы быть более конкретным:

  • При обычной навигации мой компонент должен входить справа налево
  • При обратной навигации мой компонент должен входить слева направо

и наоборот для ухода.

Если бы я мог каким-то образом определить в событии маршрутизатора, является ли это навигацией вперед или назад, я мог бы легко это сделать, но я не мог узнать, как это определить, не добавляя дополнительные данные к своим маршрутам.

Редактировать:

Я попытался сделать что-то вроде упомянутого @Vega, я вставляю фрагмент об этом.

Шаблон:

<div class="root" [@routerTransition]="navigationState$ | async" 
                  (@routerTransition.done)="onDone($event)">
    <sdx-router-outlet [size]="currentSize"></sdx-router-outlet>
</div>

Код:

this.navigationState$ = this._actions$.ofType(ActionTypes.GO_BACK)
    .map(() => {
        return { isGoingBack: true };
    })
    .merge(this._actions$.ofType(ActionTypes.GO_FORWARD).map(() => { return { isGoingBack: false }; }))
    .map((navigation: Navigation) => navigation.isGoingBack ? 'backward' : 'forward')
    .merge(this._resetNavigationState);

public onDone(event) {
    // This is just to reset to a state where I can trigger my animation again
    this._resetNavigationState.next('initial');
}

Идея заключалась в том, что я установил триггер перехода на forward при навигации вперед и backward при навигации назад. Однако, поскольку (по крайней мере, я предполагаю, что это является причиной) обратная настройка в основном «исходит» из службы ng-location, состояние будет установлено до того, как маршрутизатор начнет навигацию, и не будет никакой анимации, потому что триггер был срабатывает перед присоединением или отсоединением компонентов маршрутизатором-розеткой.

Как видите, я использую ngrx, но не думаю, что это важно. Два типа в основном просто два Observables. Один из них срабатывает при нажатии кнопки «Назад», как сказал @Vega, другой срабатывает с помощью пользовательского маршрутизатора (на данный момент), где я переопределяю метод navigationByUrl, и в нем я просто отправляю действие Forward, а затем вызываю super.

Чего я не упомянул, так это того, что я не хочу помещать анимацию в мои загружаемые компоненты, потому что вся анимация одинакова. А если я сделаю как анимацию "по умолчанию", то можно не бояться забыть поставить на какие-то компоненты.


person IThomas91    schedule 21.08.2017    source источник
comment
Иметь «глобальную» переменную, для которой установлено значение «истина», когда выполняется «нормальная»/переадресующая маршрутизация, и значение «ложь» для нажатой кнопки «Назад». Чтобы определить, когда он нажат, есть много источников, например этот: stackoverflow.com/a/40382451/5468463. Если у вас это сработает, опубликуйте ответ, мне любопытно посмотреть!   -  person Vega    schedule 22.08.2017
comment
да, я пробовал что-то подобное раньше, потому что я могу легко обнаружить нажатие кнопки «Назад» в своей системе, но поскольку оно не исходит от маршрутизатора, обратная анимация никогда не воспроизводится. Я предполагаю, что когда я запускал анимацию с помощью триггера, не было элементов :enter или :leave. Поэтому он не был анимирован. Я отредактирую свой вопрос с фрагментом об этом.   -  person IThomas91    schedule 22.08.2017
comment
у меня такая же проблема жду решения   -  person Bhavya Sanchaniya    schedule 08.08.2018