AngularJS先删除引用文档,再删除父级文档

4

我有一个删除函数,但它的代码不够好。有时会抛出错误,因为 game 被提前删除了,而不是所有的里程碑。如何在所有里程碑成功删除后才调用 game.$remove()?非常感谢!

$scope.remove = function(game) {
    if(game) { 
        var milestonesToDelete = MilestonesService.query({ gameId: game._id }, function(milestonesToDelete) {
            if(milestonesToDelete) {
                for(var i = 0; i < milestonesToDelete.length; i++) {
                    milestonesToDelete[i].$remove();
                }
            }
        });

        game.$remove();

        for (var j in $scope.games) {
            if ($scope.games [j] === game) {
                $scope.games.splice(j, 1);
            }
        }
    } else {
        $scope.game.$remove(function() {
            $location.path('admin/games');
        });
    }
};

这里缺少很多信息。告诉我们gamemilestones之间的关系,或者你收到了什么样的错误信息等等。 - Avish
如果我注释掉 game.$remove() 这一行并点击删除按钮,它将无误地删除所有里程碑(但当然不会删除游戏)。每个里程碑都被分配给游戏:assignedToGame: {type: Schema.ObjectId, ref: 'Game'}。我想先删除所有里程碑,然后再删除游戏 :-) - ketysek
1个回答

3

看起来你只需要在里程碑查询完成后删除游戏。所以只需要将那段代码放入异步回调函数中:

$scope.remove = function(game) {
    if(game) { 
        var milestonesToDelete = MilestonesService.query({ gameId: game._id }, function(milestonesToDelete) {
            if(milestonesToDelete) {
                for(var i = 0; i < milestonesToDelete.length; i++) {
                    milestonesToDelete[i].$remove();
                }
            }
            game.$remove();

            for (var j in $scope.games) {
                if ($scope.games [j] === game) {
                    $scope.games.splice(j, 1);
                }
            }
        });

    } else {
        $scope.game.$remove(function() {
            $location.path('admin/games');
        });
    }
};

非常感谢! :-) - ketysek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接