Моя проблема в том, что у меня есть несколько страниц, которые используют 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.
Чего я не упомянул, так это того, что я не хочу помещать анимацию в мои загружаемые компоненты, потому что вся анимация одинакова. А если я сделаю как анимацию "по умолчанию", то можно не бояться забыть поставить на какие-то компоненты.
:enter
или:leave
. Поэтому он не был анимирован. Я отредактирую свой вопрос с фрагментом об этом. - person IThomas91   schedule 22.08.2017