2013-04-26 5 views
44

Это, как я хотел бы проверить подключение к Интернету в ванильным JavaScript:Как проверить подключение к Интернету в AngularJs

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

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

+0

См. Также http://stackoverflow.com/questions/15574580/how-can-i-detect-with-angularjs-if-the-app-is-offline – Mawg

ответ

133

Прежде всего, советую вам послушать online/offline events.

Вы можете сделать это таким образом в 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 методе уведомления Угловым что что-то изменилось.

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

В 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

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

+0

В вашем коде js есть опечатка, вам не хватает ')' закрыть $ apply (просто попробовал, и я получаю сообщение об ошибке: Uncaught TypeError: Не могу вызвать метод addEventListener undefined –

+1

Спасибо. Я исправлю свой ответ и добавлю плункер. –

+3

Обратите внимание, что это не работает в FireFox. Они выбрали внедрение navigator.onLine по-разному, чем любой другой браузер, который действительно вредит разработчикам, которые хотят разрабатывать офлайн-приложения. –

16

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

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

+1

! + но, Lol: вот что я пытаюсь заменить. У меня была служба, которая отвечает за попытку снова подключиться. Любой, кто пытается «$ http.get» и получает 404, может вызывать службу, которая будет 1) транслировать, что не было интернета (так, чтобы никто другой не пытался подключиться), 2) регулярно пытаются подключиться к моему серверу и, 3) при успешном завершении попыток подключения и трансляции, приложение снова подключено к сети. Тем не менее, это казалось очень klunky, и это решение казалось элегантным - за исключением FF :-(Я не могу изобретать колесо здесь. Как это делают другие? – Mawg

+0

Ой, см. Мой комментарий к соответствующему вопросу http://stackoverflow.com/questions/15574580/how-can-i-detect-with-angularjs-if-the-app-is-offline «Я не D/L, я просто открыл свой имитатор, вместо того, чтобы использовать их флажок, чтобы притворяться , Я действительно вытащил свой Ethernet-кабель. В Chrome & MS IE я запускаю предупреждение «вы в автономном режиме». FF не показывал его. См. Также stackoverflow.com/questions/16242389/..., который указывает, что FF, стандарт» – Mawg

0

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

  • addEventListener на окне, документ или document.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, прежде чем пытаться посылать запросы вокруг.

Смежные вопросы