Как перенаправить пользователя на определенную страницу, нажимая кнопку возврата браузера Angular - PullRequest
0 голосов
/ 13 октября 2019

Так что мне нужно «отключить» нажатие кнопки «Назад» в браузере на нескольких маршрутах, и запрос к backeng отправлен, и это не согласовано с созданием множества подобных запросов к API. В основном я использую

this.location.onPopState(() => {
  console.log('pressed back!');
  this.router.navigateByUrl('url', { skipLocationChange: true })
});

в конструкторе, чтобы обнаружить нажатие кнопки назад, и проблема в том, что когда я нажимаю назад, меня перенаправляют не на нужную страницу, а на предыдущую. Я попытался location.here= url;, но он перезагружает окно и все еще отображает предыдущую страницу в течение секунды. Пожалуйста, если у вас есть предложения, я буду признателен за любую помощь.

1 Ответ

0 голосов
/ 14 октября 2019

Я не думаю, что это хорошая идея, чтобы заблокировать кнопку назад. Вы можете использовать механизм кэширования для запросов, чтобы он не отправлял запрос на сервер каждый раз, а получал последний ответ. Пожалуйста, проверьте этот пример:

const URL = 'https://api.punkapi.com/v2/beers';
@Injectable({
  providedIn: 'root'
})
export class HttpService {
  public responseCache = new Map();constructor(private http: HttpClient) {}public getBeerList(): Observable<any> {
    const beersFromCache = this.responseCache.get(URL);
    if (beersFromCache) {
      return of(beersFromCache);
    }
    const response = this.http.get<any>(URL);
    response.subscribe(beers => this.responseCache.set(URL, beers));
    return response;
  }
}

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

@Injectable()
export class MyGuardService implements CanActivate {  
  constructor(public auth: AuthService, public router: Router) {} 
    canActivate(): boolean {
      return !this.myService.stillDontWantToGoBack()
    }}

Это будет для всех переходов, если вам все еще нужен только задний ход, вам нужно будет проверить, совпадает ли URL-адрес, на который вы собираетесь, с previousUrl.

my-service.service.ts

previousUrl: string;
constructor(router: Router) {
  router.events
    .filter(event => event instanceof NavigationEnd)
    .subscribe(e => {
      console.log('prev:', this.previousUrl);
      this.previousUrl = e.url;
    });
} 

в my-guard.guard.ts

canActivate(route: ActivatedRouteSnapshot) {
  return route.url !== this.myService.previousUrl;
}

Ссылки и дополнительная информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...