角色服务将游戏循环和摘要周期结合在一起

时间:2014-12-16 20:30:30

标签: angularjs angular-digest

我正在整合我用Angular编写的2D JavaScript游戏引擎。游戏是一个太空游戏,引擎处理空间环境的模拟,Angular处理与空间站交易货物的菜单等。

Angular服务充当两个上下文之间的接口。例如,当游戏需要记录消息时,它会调用logServiceInstance.logDebug("Some message");。这是一个ConsoleController,它将日志消息提供给HTML div(在$ scope.logs上使用ng-repeat),覆盖游戏画布:

angular.module('game')
   .controller('ConsoleController', ['$scope', 'LogService', function($scope, logService) {
    $scope.logs = logService.getLogs();
}]);

因为游戏引擎正在更新Angular之外的服务,所以Angular并不了解其中的一些日志,因此所有日志方法(logInfo,logError,logDebug等)都会在logService上调用它。从游戏中创建的日志通过' true'作为触发摘要的第二个参数:

addLog: function(log, updateContext) {
    console.log('(' + log.level + ') ' + log.message);
    logs.unshift(log);

    // NOTE: updateContext should be passed if log is
    // called outside of Angular context. This way Angular
    // reacts to the change.
    if(updateContext != null && updateContext === true) {
        // notify angular of a change
        $rootScope.$digest();
    }
}

ConsoleController无法一致地提取日志消息。 HTML显示中会遗漏日志,但会显示在javascript控制台中。此外,我收到的错误是我在摘要中触发摘要。

问题:

  • 我如何知道其他来源的摘要是否已在进行中?
  • 服务似乎是在两个框架之间统一传递状态的最佳方式,但这是一个糟糕的模式吗?如果是这样,为什么?

提前感谢Angular大师。

注意:游戏引擎为https://bitbucket.org/profexorgeek/frostflake-js-game-engine/

1 个答案:

答案 0 :(得分:1)

Q1:

  

我如何知道其他来源的摘要是否已在进行中?

if (!$rootScope.$$phase) {
    $rootScope.$digest();
}

或只是

$rootScope.$$phase || $rootScope.$digest();

根据您的具体情况,您可能希望{$ 1}} 注意$ scope而不是$ rootScope

Q2:

  

服务似乎是在两个框架之间统一传递状态的最佳方式,但这是一个糟糕的模式吗?如果是这样,为什么?

建议使用此模式。服务是单身人士,是什么使他们适合的地方。

请参阅:Share data between AngularJS controllers