1

我正在集成我用 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/

4

1 回答 1

1

Q1:

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

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

要不就

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

根据您的具体情况,您可能需要$rootScope.$$phase || $scope.$digest(); 注意 $scope 而不是 $rootScope

Q2:

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

推荐这种模式。服务是单身人士,是什么让它们成为合适的地方。

请参阅:在 AngularJS 控制器之间共享数据

于 2014-12-16T20:45:16.120 回答