У меня есть угловое приложение, используя $ resource, который имеет некоторые фабрики, которые используют API-интерфейс Rest для некоторых вызовов.Угловая зависимость ресурсов
Сценарий, чтобы получить следующие три объекта: 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'});
});
проекта и ProjectItems запросить тот же идентификатор, но ProjectItemDetails просит detail_id найти в пределах каждого ProjectItem.
Кроме того, для каждого 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), а i равно 3.
Может ли кто-нибудь помочь?
Вы столкнулись с проблемой [позорного цикла] (http://stackoverflow.com/questions/1451009/javascript-infamous-loop-issue). К моменту, когда ваши 'ProjectItemDetails.query' обещают разрешить, значение' i' будет '$ scope.projectitems.length' для всех из них. – Phil