我正在整合我用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/
答案 0 :(得分:1)
我如何知道其他来源的摘要是否已在进行中?
if (!$rootScope.$$phase) {
$rootScope.$digest();
}
或只是
$rootScope.$$phase || $rootScope.$digest();
根据您的具体情况,您可能希望{$ 1}} 注意$ scope而不是$ rootScope
服务似乎是在两个框架之间统一传递状态的最佳方式,但这是一个糟糕的模式吗?如果是这样,为什么?
建议使用此模式。服务是单身人士,是什么使他们适合的地方。