从外角调用$ digest有什么缺点?

时间:2016-07-20 04:03:38

标签: javascript angularjs frontend

我正在开发一款仅为其用户界面使用Angular的游戏。游戏代码有一个每秒运行一次的循环。为了保持UI同步,我直接从Angular外部调用$ digest。

//from angular code
angular
    .module('app')
    .factory('acp', acp);

acp.$inject = ['$rootScope', '$window'];

function acp($rootScope, $window){
    var service = $window.ACP = {
        heartBeat: heartBeat,
        rootScope: $rootScope
    };

    return service;

    function heartBeat(){
        $rootScope.$$phase || $rootScope.$digest();
    }
}

//from game code
setInterval(function(){
    //do stuff within game
    updateResources();
    window.ACP.heartBeat();
}.bind(this), 1000);

对于一个简单的前端游戏,这是允许的吗?你能为我的角度ui和游戏代码之间的通信建议一个更好的方法吗?我有另一个全局变量,它保持我的游戏状态,Angular和游戏代码直接从窗口对象消耗,因为我非常喜欢对象引用的方便性和直接性。我理解使用全局变量的坏juju但我觉得一旦你进入游戏区域,线条会变得有点模糊。任何意见,将不胜感激。

1 个答案:

答案 0 :(得分:0)

您不必使用setTimeout。 Angular提供了一个包装器$timeout,它将负责运行摘要周期,这意味着您不必手动执行。

至于你的游戏代码和角度ui之间的沟通,这里有一些建议

  
      
  • 您可以使用factoriesservices来存储游戏状态(而不是使用任何全局变量)
  •   
  • 您也可以使用websockets所以不是每隔1秒拨打一次电话,而是与后端api(或游戏代码)建立套接字连接,并且他们互相交谈,而无需额外调用您的额外费用api每1秒。您可以从socket.io开始完成此操作
  •   
  • 您也可以使用$rootScope存储该值,但将此作为最后一个选项
  •   
     

注意:您正在使用setTimeout。要以一定间隔触发某些内容,请使用$interval。但是,分析上面的选项,找出最适合你的选项。