【问题标题】:How can I pass this callback in Angular and update $scope?如何在 Angular 中传递此回调并更新 $scope?
【发布时间】: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


    【解决方案1】:

    您似乎有一个错字。 apply 代码应该是$apply

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

    【讨论】:

    • 噢!虽然修复引入了这个:docs.angularjs.org/error/$rootScope/inprog?p0=$apply
    • @MattAndrews 这意味着触发了应用,您不需要手动触发它..?
    • ...你是对的。将我的视图逻辑更改为<div ng-hide="!encounterMode"> 修复了它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    相关资源
    最近更新 更多