1

我目前正在开发一个 AngularJS 项目,我必须从服务器获取特定月份和年份的项目信息并将其显示给用户。

首先,我得到一个项目 ID (projectList) 的列表,它可以是可变的,然后我需要获取特定年份和月份的这些项目的信息。使用此代码,我试图在最后一个项目成功时获取数据并刷新数据。获取数据后,我使用 ng-repeat 将其显示给用户。

$scope.getData = function(){
        $scope.projectInfoList = [];


        for(var index=0; index < $scope.projectList.length; index++){


            projectService.getProject($scope.model.year, $scope.model.month, parseInt($scope.projectList[index]) ).success(function(data){

                var listInput = { projectID : $scope.projectList[index], data :  data};

                $scope.projectInfoList.push(listInput); 

                if(index == $scope.projectList.length - 1){
                    $scope.$apply();
                }
            });
        };
    }

这有2个错误。

  1. 它只将数据添加到最后一个索引。
  2. 当我请求另一个月或一年的数据时,它不会立即刷新数据

我已经用$q.all寻找解决方案,但我不确定如何将它与“projectService.getProject(..)”的可变数量的函数一起使用

4

1 回答 1

1

您为函数提供的匿名回调success使用对变量的闭包index

但是,您的匿名回调将被异步调用(当调用完成时)。所以当它被调用时index将是数组的最后一个索引(所以在这里$scope.projectList.length - 1)。

为避免这种情况,您可以使用以下模式:

for(var index=0; index < $scope.projectList.length; index++){
    (function (index) {
        projectService.getProject($scope.model.year, $scope.model.month, parseInt($scope.projectList[index]) ).success(function(data){

            var listInput = { projectID : $scope.projectList[index], data :  data};

            $scope.projectInfoList.push(listInput); 

            if(index == $scope.projectList.length - 1){
                $scope.$apply();
            }
        });
    })(index)
}

projectInfoList您的第二个错误可能是因为您在函数中更改了数组的引用$scope.projectInfoList = [];

查看这篇文章以获取有关最后一个问题的更多详细信息:ng-repeat not updates on update of array

于 2015-12-08T14:42:05.140 回答