Ionic 4 / Угловые петли в истории роутера - PullRequest
0 голосов
/ 22 января 2019

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

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

Пример

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

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

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

Вот как я исправил проблему зацикливания маршрутизатора на 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 define onBackButtonPress функция для каждого лайка (как обходной путь для Ionic 3).

пример: на HomePage

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

на Page1

onBackButtonPress(){
    //back to previous page using location.back() or nav.pop()
    this.location.back();
}
0 голосов
/ 27 января 2019

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

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

Так что вам нужно, чтобы ваша кнопка работала как кнопка возврата браузера.

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

0 голосов
/ 31 января 2019

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

0 голосов
/ 27 января 2019

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

...