Javascript AngularJS-在用户脱机时使用服务更新视图

Javascript AngularJS-在用户脱机时使用服务更新视图,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,我正在构建一个应用程序,需要在用户失去互联网连接或无法访问服务器时进行检测。多个控制器和服务需要能够对此进行检查和设置。我使用角度服务和 window.addEventListener('offline', function() {OfflineService.checkIfOnline}); 然后在服兵役的时候 window.navigator.onLine ? online = true : online = false 当离线事件发生时,我需要更新视图时,棘手的部分就出现了。当服务属性

我正在构建一个应用程序,需要在用户失去互联网连接或无法访问服务器时进行检测。多个控制器和服务需要能够对此进行检查和设置。我使用角度服务和

window.addEventListener('offline', function() {OfflineService.checkIfOnline});
然后在服兵役的时候

window.navigator.onLine ? online = true : online = false
当离线事件发生时,我需要更新视图时,棘手的部分就出现了。当服务属性被事件更新时,我似乎找不到更新scope属性或controller属性的方法

当我使用$scope.$watch时,函数会触发10次(由console.log记录),然后再也不会触发

我曾尝试在JSFIDLE中复制该问题,但这是我第一次使用该工具,我不确定是否正确:

谢谢你的帮助。

看起来您是从作用域引用类,而不是从注入器创建的实例引用类(需要将其与$scope一起传入)。我还使用了watch语法,其中第一个arg是一个函数,只是为了弄清楚如何进行调用,字符串语法通常只用于引用作用域上的属性。其他一些注意事项您可以返回window.navigator.onLine,然后将值存储在服务实例上,并直接从视图中引用它,然后您可以使用$timeout循环定期调用checkOnline,或在浏览器上侦听联机/脱机事件,而不是使用watch启动函数


谢谢大家的帮助


最后我提出了一个由我的一个朋友提出的解决方案。使用
$rootScope.$emit('offlineEvent'true)$rootScope.$on('offlineEvent'this.setControllerProperty)在服务中的code>并在控制器中侦听它

?手表会鸣响10次,因为那是角度传感器的摘要。对于任何与视图相关的更新,您不需要进行任何监视:只需将值引用到范围(或控制器的“this”)即可。只要绑定到控制器,视图就会在更改时自动更新自身。。。除非使用
绑定值。如果您能进一步了解相关的服务、控制器和html结构,我们将不胜感激。@briosheje我也尝试过将值绑定到控制器,但我不知道在更新服务属性时如何更新控制器属性。你是否看到了小提琴以获取你想要的相关信息,或者我需要让小提琴更加详细?@SeanIvins小提琴是空的。在任何情况下,都应该将属性绑定到服务本身,以便当角度控制器使用它时,它会自动更新。您可以遵循的最佳方法是将此类服务属性绑定到
rootScope
,以便每个作用域都可以轻松地继承它。不要为每个控制器初始化控制器变量:尝试从上面共享它,这样就不必再担心问题;)@briosheje Oops更新了我的更改,并显示了我尝试使用$rootScope而不首先查看文档(现在这样做)。看到JSFIDLE后的任何见解都将受到赞赏。由于避免了内存泄漏,AngularJS事件侦听器应该附加到使用它们的$scope。如果连接到$rootScope,则需要在不再需要时销毁它们。有关详细信息,请参阅。另外,最好使用
$rootScope.$broadcast
。有关更多信息,请参阅。好奇您是否尝试了我的答案,或者为什么您认为这比广播事件更糟糕?我个人认为angular中的事件应仅用于系统范围内的事情,如路线更改成功或事件可能被用作分离多个父/子指令的方式,同时仍为它们提供一种通信方式。我很抱歉忘记了这个问题。你的答案是一个更好的解决方案。尽管我自己没有使用它,但您的JSFIDLE清楚地表明它是有效的,正如我在回答的注释中所指出的,我的实现可能会导致内存泄漏。再次感谢你的帮助
constructor($scope, OfflineNotificationService){