0

我正在开发一个小型游戏/模拟应用程序,我需要一个可以自我更新的应用程序范围的时间变量。它也可以是一个持续增加的数字变量,例如每秒 0..1..2..3..4 表示此模拟应用程序中的时间进度。(这不一定是 JavaScript 日期对象本身)

我希望它可以在我注入的每个控制器/服务中访问,并在整个应用程序中自动更新。其他依赖于这个时间变量的作用域变量会自动更新为 AngularJS 提供的所有双向绑定的好东西。

这甚至是 AngularJS 应用程序开发理念中的“合法”路线吗?如果是,那么如何构建它的最佳方法是什么?

4

3 回答 3

5

您可以为可以在任何需要它的地方注入的特殊服务构建一个特殊服务,或者您只需将它放在$rootScope. 通常,您应该避免将事物置于$rootScope全局状态,这通常是代码异味。但是,如果这确实是您需要的,那么这可能适合您的需求。

您可以简单地将该代码放在一个run块上,以便在加载模块后立即执行它。

myModule.run(['$rootScope', function($rootScope){
    setInterval(function(){
        $rootScope.now = new Date().getTime();
    }, 1000)
}]}

请注意,按照我编写上面代码的方式,Angular 不会收到有关该更改的通知。但是,每秒通知 Angular 更改可能不是您想要的,因为它可能会导致严重的性能问题。只是为了澄清一下:如果您确实希望 Angular 收到有关更改的通知并更新所有绑定,则需要将变量 update 包装在$apply调用中。

myModule.run(['$rootScope', function($rootScope){
    setInterval(function(){
        $rootScope.$apply(function(){
            $rootScope.now = new Date().getTime();
        });
    }, 1000)
}]}

另请注意,大多数情况下您都希望避免setInterval,因为处理之间的时间可能是不确定的。大多数时候setTimeout更适合。深入探讨这个答案超出了这个答案的范围,但如果你想阅读该主题,我建议阅读 John Resig 关于该主题的帖子: http: //ejohn.org/blog/how-javascript-timers-work/

于 2013-08-24T19:48:37.233 回答
0

当我正确理解您的问题时,您可以搜索$rootScope。在包含 rootScope 的每个 Controller/Directive/Service 中,您可以全局抛出东西。

点击这里查看很棒的AngularJS-Docu ;)

于 2013-08-24T19:34:39.780 回答
0

如果可能的话,使用$rootScope全局变量是一种代码味道,应该避免。

更好的解决方案是使用工厂/服务,您可以将其注入任何需要它的组件中。

有关更多详细信息,请参阅https://stackoverflow.com/a/18882147/2596608

于 2015-09-18T20:32:27.110 回答