AngularJS:你如何创建应用程序范围的变量来更新自己

AngularJS: How do you create app wide variable that updates itself

本文关键字:范围 应用程序 变量 自己 更新 创建 何创建 AngularJS      更新时间:2023-09-26

我正在开发一个小型游戏/模拟应用程序,我需要一个能自我更新的应用程序范围的时间变量。它也可以是一个不断增加的数字变量,例如每秒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有关更多详细信息,