2015-11-09 3 views
0

У меня есть угловое приложение, используя $ 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.

Может ли кто-нибудь помочь?

+0

Вы столкнулись с проблемой [позорного цикла] (http://stackoverflow.com/questions/1451009/javascript-infamous-loop-issue). К моменту, когда ваши 'ProjectItemDetails.query' обещают разрешить, значение' i' будет '$ scope.projectitems.length' для всех из них. – Phil

ответ

-1

Вы работаете в вариант этого:

javascript-closure-inside-loops-simple-practical-example

К тому времени ProjectItemDetails.query рассасывается, и вы в своей функции, я это 3.

Попробуйте вызова ProjectItemDetails.query из новая функция, в которой вы передаете i в качестве параметра функции.

+0

Вы знаете, что есть «голосование, чтобы закрыть как дубликат» * вариант – Phil

+0

Спасибо за помощь. Я создал новую функцию с запросом и выполнил эту функцию из исходного цикла. – DimPan

Смежные вопросы