我有一个使用$ resource的角度应用程序,它有一些工厂使用Rest API进行一些调用。
方案是获取以下三个对象: 1)项目, 2)项目项目和 3)项目项目细节。
所有三个对象都被定义为3个不同的工厂,并且如果我逐个尝试它们,它们正在正确执行。 但是,我正在尝试同时加载一个包含所有三个工厂的页面。
我尝试了几种不同的方法,但都失败了。 问题是工厂ProjectItemDetails依赖于父工厂数据,这在执行时是不可用的。
工厂
angular.module('myProject')
.factory ('Project', function($resource) {
return $resource('api/project/:id', {id: '@id'});
})
.factory ('ProjectItems', function($resource) {
return $resource('api/projectitems/:id', {id: '@id'});
})
.factory ('ProjectItemDetails', function($resource) {
return $resource('api/projectitemdetails/:id', {id: '@id'});
});
Project和ProjectItems请求相同的ID,但ProjectItemDetails请求在每个ProjectItem中找到detail_id。
现在,另外,对于每个ProjectItem,我想对在ProjectItemDetails中找到的特定字段(金额)执行求和操作。 即一个ProjectItem有3个详细记录,每个记录的数量为150,我想在每个ProjectItem中添加一个显示这些详细信息总和的字段(450)。
从后端我看到所有API都已执行,问题是将数据恢复为角度。
控制器
angular.module('myProject')
.controller('SingleController', function($scope, Project, ProjectItems, ProjectItemDetails, $rootScope, $location, $routeParams) {
$scope.project = Project.query({id: parseInt($routeParams.id, 10)});
ProjectItems({id: parseInt($routeParams.id, 10)}, function(data) {
$scope.projectitems = data;
for (var i=0; i < $scope.projectitems.length; i++) {
ProjectItemDetails.query({id: parseInt($scope.projectitems[i][“itemid”])}, function(data){
$scope.projectitems[i].details = data;
var amnt = 0;
for (var j = 0; j < $scope.projectitems[i].details.length; j++) {
amnt += $scope.projectitems[i].details[j].AMOUNT;
};
});
};
});
将数据分配给projectitem时出错 “TypeError:无法设置未定义的属性'详细信息'” 经过大量的搜索,似乎“我”已经超出界限 即我有3个项目(0,1,2),我是3个。
有人可以帮忙吗?
答案 0 :(得分:-1)
您正在遇到以下变体:
javascript-closure-inside-loops-simple-practical-example
当ProjectItemDetails.query解析并且你在它的函数内部时,我就是3。
尝试从新函数调用ProjectItemDetails.query,将i作为参数传递给函数。