从外部角度调用$digest的缺点是什么

What are the drawbacks to calling $digest from outside angular?

本文关键字:缺点 是什么 digest 调用 从外部      更新时间:2023-09-26

我正在开发一款只使用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);

对于一个简单的前端游戏,这是允许的吗?你能建议我的angular ui和游戏代码之间更好的通信方式吗?我有另一个全局变量,它保存了我的游戏状态,Angular和游戏代码都直接从窗口对象中使用,因为我非常喜欢对象引用的便利性和直接性。我理解使用全局变量的糟糕之处,但我觉得一旦你进入游戏领域,界线就会变得有点模糊。如有任何建议,我们将不胜感激。

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

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

  • 您可以使用factoriesservices来存储游戏状态(而不是使用任何全局变量)
  • 你也可以使用websockets,这样你就可以与你的后端api(或游戏代码)建立一个套接字连接,而不是每1秒调用一次,他们可以相互交谈,而无需每1秒调用你的api。您可以从socket.io开始实现这一点
  • 您也可以使用$rootScope来存储值,但将其作为最后一个选项

注意:您使用的是setTimeout。要在某个时间间隔触发某个事件,请使用$interval。但是,分析以上选项,找出哪一个最适合你。