Подтвердить что ты не робот

Как проверить подключение к Интернету в AngularJs

Вот как я могу проверить подключение к Интернету в javascript в vanilla:

setInterval(function(){
    if(navigator.onLine){
        $("body").html("Connected.");
    }else{
        $("body").html("Not connected.");
    }
},1000);

В моем проекте есть контроллеры и модули angular. Где я должен поставить код выше? Он должен выполняться в глобальном контексте и не назначаться определенному контроллеру. Есть ли какие-то глобальные контроллеры?

4b9b3361

Ответ 1

Прежде всего, я советую вам слушать онлайн-или офлайн-события.

Вы можете сделать это в AnguarJS:

var app = module('yourApp', []);

app.run(function($window, $rootScope) {
      $rootScope.online = navigator.onLine;
      $window.addEventListener("offline", function() {
        $rootScope.$apply(function() {
          $rootScope.online = false;
        });
      }, false);

      $window.addEventListener("online", function() {
        $rootScope.$apply(function() {
          $rootScope.online = true;
        });
      }, false);
});

ПРИМЕЧАНИЕ. Я переношу изменение переменной области корня в метод $apply, чтобы уведомить Angular, что что-то было изменено.

После этого вы можете:

В controlller:

$scope.$watch('online', function(newStatus) { ... });

В разметке HTML:

 <div ng-show="online">You're online</div>
 <div ng-hide="online">You're offline</div>

Вот рабочий Plunker: http://plnkr.co/edit/Q3LkiI7Cj4RWBNRLEJUA?p=preview

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

Ответ 2

Это определенно не так хорошо, но вы можете просто попробовать запрос AJAX на свой веб-сервер; это будет либо успешным, либо тайм-аутом.

Кроме того, проект HubSpot/offline выглядит действительно хорошо.

Ответ 3

Ваши варианты:

  • addEventListener в окне, документе или документе .body.

  • настройка свойств .ononline или .onoffline на документе или
    document.body к объекту функции JavaScript.

  • указание атрибутов ononline = "..." или onoffline = "..." в теге в разметка HTML

Я продемонстрирую самый простой.

В контроллере

document.body.onoffline = function() {
   alert('You are offline now');
   $scope.connection = 'offline' 
}

document.body.ononline = function() {
   alert('You are online again');
   $scope.connection = 'online' 
}

Проверяйте переменную $scope.connection, прежде чем пытаться отправлять запросы.

Ответ 4

Мы можем сделать это просто используя HostListener-Events. Мы можем использовать его, импортировав из @angular/core.

https://angular.io/api/core/HostListener

проверьте приведенную выше ссылку для более подробной информации, мы можем использовать "window: offline" и "window: online" вместо функции navigator.online, чтобы инициировать события, которые автоматически прослушиваются, если есть подключение к Интернету или нет. Исходя из этого, мы можем прикрепить вышеуказанные события в форме отображения сообщений либо в тостере, либо в диалоговом окне, либо как угодно.

В качестве примера:

import { Component, HostListener } from "@angular/core";
import { Subscription } from "rxjs";
import { Observable } from "rxjs/Observable";

@Component({

selector: 'app-online-offline',
templateUrl: './online-offline.component.html',
styleUrls: ['./online-offline.component.css']
})
export class OnlineOfflineComponent {
public isOnline: boolean;
public showConnectionStatus: boolean;
private showConnectionStatusSub: Subscription;
private showConnectionStatusTimer: Observable<any>;

constructor() {
    this.showConnectionStatusTimer = Observable.timer(5000);
}

@HostListener('window:offline', ['$event']) onOffline() {
    this.isOnline = false;
    this.showConnectionStatus = true;
    if (this.showConnectionStatusSub) {
        this.showConnectionStatusSub.unsubscribe();
    }
}

@HostListener('window:online', ['$event']) onOnline() {
    this.isOnline = true;
    this.showConnectionStatus = true;
    this.showConnectionStatusSub = this.showConnectionStatusTimer.subscribe(() => {
        this.showConnectionStatus = false;
        this.showConnectionStatusSub.unsubscribe();
        window.location.reload();
    });
}

ngOnDestroy(): void {
    if (this.showConnectionStatusSub) {
        this.showConnectionStatusSub.unsubscribe();
    }
}

}