AngularJS:你如何创建应用程序范围的变量来更新自己
AngularJS: How do you create app wide variable that updates itself
我正在开发一个小型游戏/模拟应用程序,我需要一个能自我更新的应用程序范围的时间变量。它也可以是一个不断增加的数字变量,例如每秒0..1..2..3.4,以表示该模拟应用程序中的时间进度。(这不一定是JavaScript日期对象本身)
我希望它在我注入的每个控制器/服务中都可以访问,并在整个应用程序中自动更新。然后,依赖于此时间变量的其他范围变量将使用AngularJS提供的所有双向绑定功能自动更新。
这甚至是AngularJS应用程序开发理念中的一条"合法"路线吗?如果是这样的话,如何构建它的最佳方式是什么?
您可以为它构建一个特殊的服务,可以在需要的地方到处注入,也可以将它放在$rootScope
上。通常,您应该避免将东西放在$rootScope
上,因为全局状态通常是一种代码气味。然而,如果这真的是你的情况下所需要的,那么这可能符合你的需求。
您可以简单地将该代码放在run
块上,以便在加载模块后立即执行。
myModule.run(['$rootScope', function($rootScope){
setInterval(function(){
$rootScope.now = new Date().getTime();
}, 1000)
}]}
请注意,按照我在上面编写代码的方式,Angular不会收到有关更改的通知。然而,每秒通知Angular更改可能不是您想要的,因为这可能会导致严重的性能问题。只是澄清一下:如果确实希望Angular收到更改通知并更新所有绑定,那么变量更新将需要封装在$apply
调用中。
myModule.run(['$rootScope', function($rootScope){
setInterval(function(){
$rootScope.$apply(function(){
$rootScope.now = new Date().getTime();
});
}, 1000)
}]}
还要注意,在大多数情况下,您希望避免setInterval
,因为处理之间的时间可能是不确定的。大多数情况下CCD_ 6更适合。深入研究这个问题超出了这个答案的范围,但如果你想了解这个话题,我建议你阅读John Resig关于这个话题的帖子:http://ejohn.org/blog/how-javascript-timers-work/
当我理解你的问题后,你会搜索$rootScope。在每个包含rootScope的控制器/指令/服务中,您可以全局抛出内容。
点击此处查看真棒AngularJS Docu;)
如果可能的话,应该避免对全局变量使用$rootScope
。
一个更好的解决方案是使用工厂/服务,您可以将其注入到需要它的任何组件中
请参阅https://stackoverflow.com/a/18882147/2596608有关更多详细信息,
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 在MVVM视图模型中处理应用程序范围的元素
- 游戏应用程序 BIGINT 无符号值超出范围
- 将Excel.run中的范围对象重新用于办公应用程序
- 在全球范围内强制ng严格di,而不仅仅是在ng应用程序级别上
- 选中的Angular HTML列表将所选值放入应用程序范围的变量和跨度中
- 谷歌应用程序脚本:;范围不是函数,它是对象;尝试在单元格中放置注释时出错
- AngularJS-范围错误:''之后超过了最大调用堆栈大小;应用程序启动
- 为Backbone.js应用程序设计依赖注入系统的范围界定问题
- 适用于 Javascript 函数的应用程序范围的身份验证处理程序
- 由全局范围内的 Web 应用程序声明的全局变量
- 如何将范围滑块添加到轨道应用程序
- 应用程序的主控制器范围
- Javascript范围在角度SPA应用程序中不起作用
- 如何在 angularjs 应用程序中注销时删除/清除存储在范围变量中的数据
- 有没有办法限制淘汰.js应用程序的范围
- Javascript ToDo 应用程序,无法递增创建的总任务数/无法理解变量范围
- 如何访问Angular应用程序's$templateCache来自全局范围
- 如何在HTML5中实现应用程序范围的内存缓存
- AngularJS:你如何创建应用程序范围的变量来更新自己