angularjs服务未按预期工作

angularjs服务未按预期工作,angularjs,Angularjs,我有以下服务: angular.module('autotestApp').factory('GroupService', ['$http', function ($http) { var groups = []; return{ list: function () { return groups; }, retrieve: function () { $http({

我有以下服务:

angular.module('autotestApp').factory('GroupService', ['$http', function ($http) {
    var groups = [];

    return{
        list: function () {
            return groups;
        },
        retrieve: function () {
            $http({
                method: "get",
                url: "/enterprises/_groups"
            }).success(function (response) {
                groups = response;
            }).error(function () {
                console.log("failed")
            });
        }
    }
}]);
这是我的控制器:

angular.module('autotestApp').controller('GroupsController', function($scope, $http, GroupService) {
    GroupService.retrieve();
    $scope.items = GroupService.list();
});
因此,在我的控制器中,我首先从API获取结果,以便分配变量组(在服务中),然后使用list()方法将值分配给$scope.items

我确信API正在返回结果。但是

groups = response
零件工作不正常。当我把它改成

groups.push(response)
它正在工作,但结果是列表中的一个列表,这是我不想要的:[[Object,Object,Object]]

我要这个:[对象,对象,对象]


如何修复此问题?

您可以使用的修复方法之一是:

for (var i = 0; i < response.length; i++) {
     groups.push(response[i]);
});
然后在控制器中:

angular.module('autotestApp').controller('GroupsController', function($scope, $http, GroupService) {
    GroupService.retrieve().finally(function () {
         $scope.items = GroupService.list();
    });
});
我认为您的
groups=response
正在工作,但是当您执行
$scope.items=GroupService.list()
时,请求尚未完成。

执行
groups.concat(response)
这将展平项目并将其添加到父列表中,而不是附加单个元素。

原因

groups = response
不工作是因为您正在发送一个异步请求,该请求将在您已经通过
list
函数检索到旧引用后替换组引用。它与
push
修改一起工作的原因是Angular创建了一个手表,它会注意到收藏已更改并更新您的视图。然而,您的代码现在可以工作了,但您不明白它为什么可以工作,而且它很容易意外地崩溃

在处理异步代码时,最好的处理方法是编写自己的代码来考虑这一点。以下是一个以异步方式完成整个任务的版本:

angular.module('autotestApp').factory('GroupService', ['$http', function ($http) {
    var groupsResult;

    return{
        retrieve: function () {
            if (groupsResult) { return groupsResult; }
            return groupsResult = $http({
                method: "get",
                url: "/enterprises/_groups"
            }).then(function (response) {
                return response.data;
            }, function () {
                console.log("failed")
            });
        }
    }
}]);

angular.module('autotestApp').controller('GroupsController', 
    ['$scope', 'GroupService', function($scope, GroupService) {
        GroupService.retrieve().then(function (groups) {
            $scope.items = groups;
        });
    }]);

是的,你是对的,但是当我有数千个来自api的结果时,这会不会很昂贵?)从性能方面来说,最好是手动迭代列表,而不是使用
angular.forEach
<代码>对于(var i=0;i()@MichelTomé您的编辑与我所写的几乎相同。:)@杰弗里布,我编辑了我的答案,谢谢你提醒我。拍打self@Rytmis对此很抱歉:Pnot不起作用,我认为这是因为concat只对基元类型起作用。在这里,我在节点REPL上得到objectsrun:a=['b','c','d']['b','c','d']b=[Object(),Object(),Object()[{},{},{},{}]>a.concat(b)['b','c','d',{},{},{},{}这正在工作:),但我需要将该groups变量分配给response.data,以便我可以在另一个控制器中使用它。但是,我没有提到我的问题和您的答案是正确的,因此我将接受itI编辑的答案以添加响应的缓存,这样您可以在不同的控制器中使用结果,但它只发出单个请求。
angular.module('autotestApp').factory('GroupService', ['$http', function ($http) {
    var groupsResult;

    return{
        retrieve: function () {
            if (groupsResult) { return groupsResult; }
            return groupsResult = $http({
                method: "get",
                url: "/enterprises/_groups"
            }).then(function (response) {
                return response.data;
            }, function () {
                console.log("failed")
            });
        }
    }
}]);

angular.module('autotestApp').controller('GroupsController', 
    ['$scope', 'GroupService', function($scope, GroupService) {
        GroupService.retrieve().then(function (groups) {
            $scope.items = groups;
        });
    }]);