2013-04-26 12 views
44

ten sposób chciałbym sprawdzić połączenia internetowego w waniliowym javascript:Jak sprawdzić połączenia internetowego w angularjs

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

mam kątowych sterowniki i moduły w moim projekcie. Gdzie powinienem umieścić powyższy kod? Powinien być wykonany w kontekście globalnym i nie powinien być przypisany do określonego kontrolera. Czy może jest jakiś globalny kontroler?

+0

Zobacz także http://stackoverflow.com/questions/15574580/how-can-i-detect-with-angularjs-if-the-app-is-offline – Mawg

Odpowiedz

133

Przede wszystkim radzę posłuchać: online/offline events.

Można zrobić to w ten sposób w 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); 
}); 

UWAGA: mam owijania zmianę zmiennej korzeń oscyloskopu w $apply sposobu powiadamiania kątowa, że ​​coś się zmieniło.

Po tym można:

W controlller:

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

W znacznikach HTML:

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

Oto Plunker robocze: http://plnkr.co/edit/Q3LkiI7Cj4RWBNRLEJUA?p=preview

Innym rozwiązaniem mogłoby być rozgłaszać zdarzenie online/offline. Ale w tym przypadku musisz zainicjować bieżący stan po załadowaniu, a następnie zasubskrybować wydarzenie.

+0

Twój kod js ma literówkę, brakuje Ci ')', aby zamknąć $ apply (.) Po prostu wypróbowałem i otrzymałem błąd: Uncaught TypeError: Can not call method 'addEventListener' of undefined –

+1

Dziękuję, poprawię odpowiedź i dodaję plunkera. –

+3

Uwaga: to nie działa w FireFox. Zdecydowali się wdrożyć navigator.onLine inaczej niż każda inna przeglądarka, co bardzo szkodzi programistom, którzy chcą tworzyć aplikacje offline. –

16

To zdecydowanie nie jest tak miłe, ale można po prostu wypróbować żądanie AJAX do swojego serwera; to się uda albo przestanie działać.

Również, HubSpot/offline project wygląda naprawdę dobrze.

+1

! + ale, Lol: to właśnie próbuję zastąpić. Miałem usługę, która jest odpowiedzialna za próbę ponownego połączenia. Każdy, kto spróbuje '$ http.get' i dostanie 404, może wywołać usługę, która 1) nadawałaby, że nie było internetu (tak, aby nikt inny nie próbował się połączyć), 2) regularnie próbował połączyć się z moim serwerem i, 3) po pomyślnym zakończeniu, zatrzymać próby połączenia i nadać, że aplikacja jest znowu online. Jednak wydawało się to bardzo dziwaczne i to rozwiązanie wydawało się eleganckie - z wyjątkiem FF :-(Nie mogę wymyślić na nowo koła tutaj.Jak inni robią to? – Mawg

+0

Ups, zobacz mój komentarz do pokrewnego pytania http://stackoverflow.com/questions/15574580/how-can-i-detect-with-angularjs-if-the-app-is-offline "Nie zrobiłem tego D/L, po prostu otworzyłem ich symulator, zamiast używać tego pola wyboru do udawania , Faktycznie wyciągnąłem kabel Ethernet W przeglądarce Chrome i MS IE przejdę do alertu "jesteś offline" FF nie wyświetlił tego komunikatu Zobacz także stackoverflow.com/questions/16242389/... co wskazuje, że FF wydaje się być standard" – Mawg

0

Twoje opcje:

  • addEventListener na okna, dokumentu lub document.body.

  • Ustawienie właściwości .ononline lub .onoffline na dokumencie lub
    document.body na obiekt funkcji JavaScript.

  • określając ononline = "..." lub onoffline = "..." atrybutów znacznika w znaczników HTML

wykażę najłatwiejsze.

W Tobie kontrolera

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

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

zmienną scope.connection Sprawdź $ zanim spróbujesz wysłać żądania dokoła.

Powiązane problemy