Петли Ionic 4/Angular в истории маршрутизатора

Если я перехожу с одной страницы на другую и обратно несколько раз, я могу просмотреть всю историю маршрутизатора с помощью аппаратной кнопки или кнопки «Назад» в браузере.

Я хочу добиться того, чтобы аппаратная кнопка «Назад» выводила меня на ту же страницу, что и ion-back-button на моей панели инструментов.

Пример

Страница 1 > Страница 2 > Страница 3

Я перехожу от Страница 1 к Страница 2. Затем я перехожу от Страница 2 к Страница 3 и обратно через ion-back-button несколько раз. Если я затем нажму аппаратную/браузерную кнопку «Назад», я снова попаду в Страница 2 и Страница 3 в цикле. Вместо этого я хочу, чтобы аппаратная/браузерная кнопка «Назад» переходила к Страница 1, если я нажму ее на Страница 2.

Вы не получите прямого метода для обработки обратного состояния браузера. вам нужно обработать событие и написать свой собственный код.

Kajol Chaudhary 31.01.2019 08:28

Здесь вы найдете свой ответ введите сюда описание ссылки

Houssem Badri 31.01.2019 12:48
Здесь ваш ответ, что я очень согласен с подходом.
Houssem Badri 31.01.2019 12:49
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
6
3
2 498
4

Ответы 4

В основном вы пытаетесь настроить поведение кнопки «Назад» в браузере. Вы можете попробовать что-то вроде приведенной ниже статьи Javascript: изменение функции кнопки «Назад» в браузере.

Проблема с ion-back-button заключается в том, что он использует не История API браузера, а вместо этого переходит в предыдущее состояние. Вот почему вы заметили следующее поведение:

  • Вернитесь на страницу 2, нажав один раз на ion-back-button, который под капотом вызывает переход на страницу 2.
  • Вернитесь на страницу 3, нажав один раз кнопку «Назад» в браузере, поскольку предыдущая навигация была на странице 3.

Итак, вам нужно, чтобы ваша кнопка вела себя как кнопка «Назад» в браузере.

Для этого забудьте директиву ion-back-button и реализуйте поведение click самостоятельно, используя Местоположение::назад().

вы можете использовать этот плагин https://github.com/ionic-team/cordova-plugin-ionic-webview Этот плагин упрощает использование маршрутизации в стиле HTML5, которую веб-разработчики ожидают для создания одностраничных приложений.

Вот как я исправил проблему зацикливания маршрутизатора в Ionic 4. Я знаю и ранее реализовал известный обходной путь кнопки «Назад» в Ionic 3, но это не сработает в Ionic 4, поскольку он использует угловую маршрутизацию.

Поэтому я искал способ получить активный в данный момент экземпляр вида. Если я получу экземпляр представления, то смогу вызвать некоторую функцию backButtonAction, определенную на этой странице (аналогично обходному пути Ionic 3).

Ладно, хватит болтовни. вот код:

app.component.ts

export class AppComponent {
    @ViewChildren(IonRouterOutlet) routerOutlets:QueryList<IonRouterOutlet>;
    constructor(
    private alertCtrl:AlertController,
    private modalCtrl:ModalController,
    private actionSheetCtrl: ActionSheetController,
    private menu:MenuController,
    private platform: Platform
    ){
        this.initializeApp(); 
    }

    initializeApp(){
        ...
        this.registerHardwareBackButton();  
    }

    registerHardwareBackButton() {
        this.platform.backButton.subscribe((e) => {
            e.register(999, async () => {   
            // first close any alets, modal etc. 

            const actionsheet = await this.actionSheetCtrl.getTop();             
            if (actionsheet){
                actionsheet.dismiss();
                return;             
            }

            const modal = await this.modalCtrl.getTop(); 
            if (modal){
                modal.dismiss();
                return;
            }

            const alert = await this.alertCtrl.getTop();            
            if (alert){
                alert.dismiss();
                return;             
            }

            const menu = await this.menu.getOpen();
            if (menu){
                menu.close();
                return; 
             }

             const outlet:any = this.routerOutlets.first();
             const activeView = outlet.activated.instance; // the active view instance          
             //now calls the onBackButtonPress function in that instance            
             if (activeView.onBackButtonPress){
                activeView.onBackButtonPress();                 
             }else {
                //some logic about what to do if onBackButtonPress is not defined, default action       
             }
          });
       }); 
    }

и если у вас есть пользовательский поток навигации, подобный этому HomePage => Page1 => Page2 определить функцию onBackButtonPress для каждого лайка (как обходной путь для Ionic 3).

пример: на Домашняя страница

onBackButtonPress(){
    navigator['app'].exitApp(); //closes the app, bad UX
}

на Страница 1

onBackButtonPress(){
    //back to previous page using location.back() or nav.pop()
    this.location.back();
}

Другие вопросы по теме