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

Har*_*nis 0 javascript angularjs angularjs-service

我正在开发一个小型游戏/模拟应用程序,我需要一个应用程序范围的时间变量来更新自己.它也可以是一个数字变量,对于我所关心的所有内容都在不断增加,例如每秒0..1..2..3..4,以表示此模拟应用程序中的时间进度.(这不一定是JavaScript Date Object本身)

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

这甚至是AngularJS app dev哲学中的"合法"线吗?如果是,那么构建它的最佳方法是什么?

Chr*_*oph 5

你可以为那些可以在任何需要的地方注入的特殊服务构建一个特殊的服务,或者你只是把它放在上面$rootScope.通常你应该避免把东西放在$rootScope全球状态通常是代码味道.但是,如果这确实是您需要的,那么这可能满足您的需求.

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

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

请注意,在我编写上述代码的方式中,Angular不会收到有关该更改的通知.但是,每隔一秒通知Angular有关这种变化可能不是您想要的,因为它可能导致严重的性能问题.只是为了澄清事情:如果你确实希望Angular得到有关更改的通知并更新所有绑定,那么变量更新将需要包含在$apply调用中.

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

还要注意,大多数时候你要避免setInterval因为处理之间的时间可能是非确定性的.大部分时间setTimeout都更适合.这个问题超出了这个范围,但如果您想阅读该主题,我建议您阅读John Resig关于该主题的帖子:http://ejohn.org/blog/how-javascript-timers-work/