如何在Angular中传递此回调并更新$scope

How can I pass this callback in Angular and update $scope?

本文关键字:回调 更新 scope Angular      更新时间:2024-05-10

我正在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——修复了这个错误后,我现在看到错误:$rootScope:inprog Action Already In Progress。有没有感觉我还在错误地处理这个问题?

您似乎有拼写错误。apply代码应为$apply

$scope.$apply(function() {
//-----^ this thing