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;iangular.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;
});
}]);