网络状态的全局侦听器
Global listener for network status
通过这种方式,我可以使用在每个应用程序视图中显示简单角度材料警报的功能,对全局监听器(或其他)检查我们是否在整个应用程序中可见互联网连接,无论我在哪个控制器中和控制器内部。
所以,如果我需要在任何控制器中调用这个,我想还有另一种方法可以实现,但我不知道如何实现。
listener我使用addEventListener的方式编写。
您可以在run
部分中订阅该事件
.run(['$rootScope', '$window', function($rootScope, $window) {
$rootScope.online = $window.navigator.onLine;
if (!$rootScope.online) {
//do actions here
//for example go to special state, $state.go('offline')
alert('Offline!');
}
$window.addEventListener("offline", function() {
//do actions here
//for example set $rootScope.online = false;
alert('Offline!');
}, false);
$window.addEventListener("online", function() {
//do actions here,
//for example set $rootScope.online = true;
alert('Online!');
}, false);
}])
1) 由于它在run
块中,所以它位于层次结构的顶部;在应用程序启动时执行;我在几个项目中使用了这种方法,并且它适用于所有控制器;
2) 第一次if检查是针对首次初始应用程序启动阶段;因为你可能是
- 使用服务人员,即使离线也可以应用UI
- 用户在手机上保存了一个带有"添加到主屏幕"的快捷方式
您可以使用类似Offline 的东西
或者推出自己的
angular.module('plunker', [])
.factory('OnlineStatus', function($timeout) {
var isOnlineNow = true,
isOnline = function() {
$timeout(function() {
isOnlineNow = true;
});
},
isOffline = function() {
$timeout(function() {
isOnlineNow = false;
});
};
if (window.addEventListener) {
/*
Works well in Firefox and Opera with the
Work Offline option in the File menu.
Pulling the ethernet cable doesn't seem to trigger it.
Later Google Chrome and Safari seem to trigger it well
*/
window.addEventListener("online", isOnline, false);
window.addEventListener("offline", isOffline, false);
}
else {
/*
Works in IE with the Work Offline option in the
File menu and pulling the ethernet cable
*/
document.body.ononline = isOnline;
document.body.onoffline = isOffline;
}
return {
isOnline:function() {
return isOnlineNow;
}
};
})
.directive('online', ['OnlineStatus', function(OnlineStatus) {
return {
template:'<div class="online"></div>',
replace:true,
restrict:'E',
link:function(scope, elem, attrs) {
scope.$watch(function() {
return OnlineStatus.isOnline();
}, function(isOnline) {
elem.html(isOnline ? 'Online' : "Offline");
})
}
};
}])
请参阅http://plnkr.co/edit/DrW8UdYsediusRMu1aMo?p=preview
相关文章:
- Highslide(iframe的侦听器)
- 如何在for循环中添加事件侦听器
- 选项卡侦听器未被来自后台脚本的消息激活
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 加载侦听器上的函数触发得太早
- 无法将事件侦听器附加到画布
- 如何在d3.js中自定义事件侦听器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- 事件侦听器未在chrome扩展中的options.js中启动
- IE8更改文本区域上的事件侦听器不工作
- 网络状态的全局侦听器
- 为什么在定义回调/侦听器函数(异步消息传递,port.on)后没有立即设置全局变量
- 全局变量从事件侦听器中变得未定义 - javascript
- 全局范围 - 在触发事件侦听器后访问“this”
- 如何在方法中添加事件侦听器时调用 removeEventLisener 并在 JavaScript 中的全局函数中调用
- 将全局onBeforeCall侦听器附加到除一个调用之外的所有AJAX调用
- 侦听器调用的Javascript函数不能更新全局变量
- Twitter bootstrap - 如何在全局侦听器上设置 JavaScript 属性,而不重复代码
- 是否可以使用全局AJAX侦听器来获取AJAX调用的源