【发布时间】:2016-04-11 09:51:09
【问题描述】:
我正在用 AngularJS 编写一个基本的游戏应用程序。游戏有room 对象,其中一些包含enemy 对象。我有一个moveRoom() 的函数,如果房间包含enemy,它需要一个回调参数来运行。
在这个回调函数中,我的$scope 更改不会在ng-show 元素上注册。我尝试了 $scope.apply() 和 $scope.digest() 的组合,但无济于事:
$scope.moveToRoom = function (newRoom) {
// the callback here is only triggered if roomToMoveTo contains an enemy
manager.setCurrentRoom(roomToMoveTo, function($scope, encounterType, data) {
$scope.apply(function() {
if (encounterType === 'enemy') {
$scope.encounterMode = true;
}
});
});
};
...setCurrentRoom() 函数(在另一个模块中定义)如下所示:
var setCurrentRoom = function (room, callback) {
$scope.currentRoom = room;
if (callback) {
var enemies = room.getEnemies();
if (enemies.length > 0) {
callback($scope, 'enemy', enemies);
}
}
return $scope.currentRoom;
};
(您可以看到我尝试将 $scope 传递给回调函数,但这没有帮助)。
我得到的错误是 Error: $scope.apply is not a function,或者如果我删除它,我不会得到任何 UI 更改(我希望 ng-show="encounterMode" 发生这种变化)。
我能想到的唯一可能破坏的事情是我在模块之间共享$scope的方式——manager模块是另一个通过requireJS加载的文件——它返回一个带有$scope参数的函数,所以我用$scope 初始化manager 模块,所以它的所有方法都可以访问全局范围。不确定在将 Angular 与 AMD JavaScript 混合时是否有更好的方法。
关于让这个回调更新范围,我在这里有什么遗漏吗?我是不是传错了?
编辑:正如 TJ 指出的那样,我有一个错字,应该是 $apply - 修复了这个问题,我现在看到了 Error: $rootScope:inprog Action Already In Progress。感觉我仍然在错误地处理这个问题?
【问题讨论】:
标签: javascript angularjs callback