Ionic 4 - проверьте, можно ли вернуться

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

Мне нужно добавить условие в мой код, но я, кажется, не нахожу способа.

  goback() {
    if ("something") {
      this.navCtlr.setDirection('back');
      this.location.back();
    }
    else {
      this.router.navigate(['/']);
    }
  }

В Ionic 3 у нас была функция canGoBack() 1… Есть идеи для Ionic 4? Поскольку он использует маршрутизатор Angular...

Спасибо.

Тестирование функциональных 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
4
0
4 623
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку Ionic 4 использует Angular Routing, поэтому вы можете реализовать эту функциональность способом Angular, вы можете добиться этого, создав такой сервис:

import { Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';

@Injectable()
export class PreviousRouteService {

  private previousUrl: string;
  private currentUrl: string;

  constructor(private router: Router) {
    this.currentUrl = this.router.url;
    router.events.subscribe(event => {
      if (event instanceof NavigationEnd) {        
        this.previousUrl = this.currentUrl;
        this.currentUrl = event.url;
      };
    });
  }

  public getPreviousUrl() {
    return this.previousUrl;
  }    
}

А теперь внедрите этот сервис в компонент, в котором вы хотите проверить свое состояние:

В вашем компоненте:

import { Component } from '@angular/core';
import { PreviousRouteService } from '../services/previous-route.service';

@Component({
  selector: 'app-root',
  templateUrl: 'app.component.html'
})
export class AppComponent {
  constructor(private previousRouteService: PreviousRouteService) {}  

  goback() {
    if (this.previousRouteService.getPreviousUrl()) {
      this.navCtlr.setDirection('back');
      this.location.back();
    }
    else {
      this.router.navigate(['/']);
    }
  }
}

Хотя, к сожалению, это не работает :( Я добавил console.info(this.currentUrl, this.previousUrl, event.url, event instanceof NavigationEnd); в функцию прослушивания событий, и получил очень большой список /item/item_id undefined undefined false ответов, пока один не верен в конце концов, а затем куча других, где this.previousUrl (как и должно быть быть, так как он видел NavigationEnd) так же, как this.currentUrl. Поэтому, когда goBack() срабатывает, он видит previousUrl там, где не должен, - таким образом, не достигая желаемого эффекта.

Jeremy Belolo 28.05.2019 20:33
Ответ принят как подходящий

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

Это и использование службы истории навигации (RoutingStateService), такой как упомянутый в https://blog.hackages.io/our-solution-to-get-a-previous-route-with-angular-5-601c16621cf0. В тех случаях, когда я использовал RoutingStateService для обработки своей истории навигации, это было намного надежнее, чем прямое доверие событиям NavigationEnd (поскольку RouterStateService использует его внутри).

Надеюсь, поможет. С наилучшими пожеланиями.

Разве вы не можете использовать <ion-back-button> с defautHref?

<ion-back-button defaultHref = "/"></ion-back-button>

Привет, кажется интересным (я не уверен, что это сработает, и сейчас не могу проверить, давно ушел) - хотя ion-back-button не появляется, если нет истории, я думаю?

Jeremy Belolo 02.01.2020 09:51

добавив defaultHref, если истории нет, он ее «создает», поэтому кнопка «Назад» будет там :)

Erwan 03.01.2020 10:27

NIce и легко, но не может быть предотвращено или отложено с операциями до обратного действия (т.е. сохранить данные, прежде чем вернуться)

Jackie Degl'Innocenti 08.04.2020 19:24

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