Как обрабатывать страницу потери соединения в Angular 7?

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

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

Для этого я реализовал защиту canActivate в виде следующего кода:

@Injectable({
  providedIn: 'root'
})
export class NetworkGuard implements CanActivate {
  constructor(private router: Router, private network: NetworkService) {
  }

  canActivate(next: ActivatedRouteSnapshot,
              state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    if (window.navigator.onLine) {
      return true;
    } else {
      if (!this.isConnectionLostComponent()) {
        this.router.navigate(['/connection-lost'], {skipLocationChange: true});
      }
      return false;
    }
  }

  private isConnectionLostComponent() {
    // check whether connection lost component is added on not
    return this.network.isActive;
  }
}

Работает нормально, кроме одного условия. То есть, если я нажму назад или вперед из браузера, его URL-адрес обновления ConnectionLost на Адресная строка

Как я могу решить эту проблему? Можно посмотреть образец Здесь

шаги для создания проблемы:

  1. Нажмите баннер (кнопка) -> URL-адрес изменить на «/баннер»
  2. Нажмите бренд (кнопка) -> URL-адрес изменится на «/ бренд»
  3. Отключить сеть на этой странице бренда
  4. Нажмите назад из браузера-> ConnectionLostComponent и URL-адрес «/ бренд», все в порядке
  5. Нажмите еще раз -> ConnectionLostComponent, но URL-адрес также изменится на «/connection-lost». это то, что я столкнулся с проблемой.

Я просто не хочу обновлять URL-адрес с помощью «/ соединение-потеряно», для этого я добавил параметр connection-lost к методу skipLocationChange: true в router.navigate, но все равно это не работает.

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

user4676340 18.02.2019 16:10

@trichetriche Я могу проверить последний посещенный URL-адрес, но как я могу запретить пользователю вернуться, пока он / она не будет в сети, и я добавил условие аналогичного типа в метод isConnectionLostComponent (), пожалуйста, проверьте мой обновленный вопрос.

Ravi Sevta 19.02.2019 06:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
10
3
5 634
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

app.component.ts

constructor(){
this.onlineOffline = Observable.merge(of(navigator.onLine),
      fromEvent(window, 'online').pipe(map(() => true)),
      fromEvent(window, 'offline').pipe(map(() => false))
    );
}

app.component.html

<ng-container *ngIf = "onlineOffline | async; then thenTemplate; else elseTemplate"></ng-container>
<ng-template #thenTemplate>
 <router-outlet></router-outlet>
</ng-template>
<ng-template #elseTemplate>
  <app-no-network></app-no-network>
</ng-template>

Дайте мне знать, работает ли он так, как вам нужно, или нет.

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

Ravi Sevta 19.02.2019 07:11

Кстати, какая польза от этого? Я просто хочу знать. @RaviSevta

AlokeT 19.02.2019 07:13

Пользователь может видеть содержимое текущей страницы, если нет сети. действовать — дело вторичное. @ АлокеТ

Ravi Sevta 19.02.2019 07:39

Таким образом, вы можете сделать прозрачный оверлей и активировать его, когда нет сети, чтобы пользователь мог только видеть контент, но не мог ничего сделать. также добавьте <app-no-network> свойство с именем show, которое будет отображать небольшие изменения на странице, как YouTube в своем приложении для Android.

AlokeT 19.02.2019 07:44

но я должен показать пользовательский интерфейс разрыва соединения без интернета.

Ravi Sevta 19.02.2019 07:49

Да, это то, что я хочу.

Ravi Sevta 19.02.2019 07:53

Давайте продолжить обсуждение в чате.

AlokeT 20.02.2019 05:42
Ответ принят как подходящий

После небольшого поиска и с помощью ответа @AlokeT. Я получил решение этой проблемы.

Предложение @AlokeT показывает страницу потери соединения, как только пользователь потерял свою сеть. но мое требование состоит в том, чтобы показать эту страницу потери соединения, когда он/она пытается перейти на другую страницу.

И в этом ответе я просто добавил недостающую часть.

Для этого я просто обновляю этот флаг isNetworkStopped из Guard, и потому что каждый Guard CanActivate выполняется до начала навигации. Таким образом, компонент потери соединения будет отображаться, когда пользователь меняет путь.

Есть код NetworkService, который я использую в NetworkGuard,

@Injectable({providedIn: 'root'})
export class NetworkService {

  online: boolean;
  isNetworkStopped = false;

  constructor() {
    this.online = window.navigator.onLine;

    fromEvent(window, 'online').subscribe(e => {
      this.online = true;
    });

    fromEvent(window, 'offline').subscribe(e => {
      this.online = false;
    });
  }
}

Здесь в приведенном выше коде я просто добавил флаг isNetworkStopped. И обновил этот флаг с NetworkGuard, что означает, что пользователь пытается перейти на следующую страницу и не находит сети.

А также убрал навигацию из NetworkGuard. Смотрите мой ниже, обновленный код NetoworkGuard

@Injectable({providedIn: 'root'})
export class NetworkGuard implements CanActivate {
  constructor(private network: NetworkService) {
  }

  canActivate(next: ActivatedRouteSnapshot,
              state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    if (this.network.online) {
      return true;
    }
    this.network.isNetworkStopped = true;
    return false;
  }
}

И на основе этого флага мне удалось показать компонент ConnectionLost. Для этого ConnectionLostкомпонент добавляется по условию на основе шаблона корневого компонента.

app.component.html

<router-outlet *ngIf = "!networkService.isNetworkStopped"></router-outlet>
<app-connection *ngIf = "networkService.isNetworkStopped"></app-connection>

И из компонента ConnectionLost, если пользователь нажимает кнопку перезагрузки. Проверив сетевое соединение, я обновил флаг isNetworkStoppedNetworkService.

Поскольку networkService уже имеет свойство «онлайн», почему ему все еще нужен флаг isNetworkStopped?

peanut 28.02.2019 01:56

Да, @peanut, это правда, но поскольку пользователь переходит к другому компоненту, я меняю этот флаг (isNetworkStopped). чтобы пользователь мог видеть компонент потери соединения при изменении маршрута, а не сразу после потери соединения. Это мое основное требование.

Ravi Sevta 28.02.2019 06:21

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