2014-10-04 2 views
2

У меня есть небольшой webapp, который использует AngularJS на передней панели и Java на внутреннем сервере. Я использую REST для связи.Итерация через ресурс AngularJS с вложенными массивами

На заднем конце я создаю список списков, например:

 List<List<Data>> allData = new ArrayList<>(); 
     allData.add(firstList); 
     allData.add(secondList); 

Когда это доходит до переднего конца, это выглядит как на скриншоте ниже - то есть вместо того, чтобы быть 2 массивом [] в пределах одного объекта Array [], это 2 из этих объектов Resource со списком объектов Array []. Проблема в том, что теперь я хочу перебирать этот список массивов, и я не знаю, как получить длину списка из этого ресурса! Я пробовал длину, размер, количество ... все не определены.

Вопрос в том, как я могу заставить его сохранить массив в структуре массива, чтобы я мог легко итерации? Или как получить длину из объекта Resource?

TIA (Извините, новичок вопрос).

enter image description here

Расширение Aone узлов ресурсов:

enter image description here

ответ

2

Поведение вы испытываете каким-то образом связано с тем, что в $resourcequery(), в котором ожидалось, данные отклика представляет собой массив, каждый элемент данных в массиве превращается в объект Resource, который содержит методы действий экземпляра, с приложением суффикс $.

Как вы можете видеть в Resource Reference Object выше, он выполняет shallowClearAndCopy() копию элемента данных в массиве, дополняющая все свойства элемента данных самому объекту ресурса, используя for..in, который выполняет только итерации свыше enumerable Недвижимость.Так как Array.length, не является перечислимым свойством, то добавление объекта length в Объект объекта из массива невозможен.

У вас есть три способа, чтобы исправить эту проблему:

[] Вы можете создать метод действия пользовательского, который имеет те же свойства, что и метод query() действия, но с дополнительным определением transformResponse(). Метод transformResponse() запускается после запроса, но до разрешения любых обещаний. Он передается с помощью строки JSON, которую вы можете преобразовать в обычный json-объект через angular.fromJson() и перебирать все массивы и увеличивать каждый объект объекта с помощью нового свойства enumerable, разрешать его ._length и затем возвращать новый десериализованный объект за обещания получить. Таким образом, метод shallowClearAndCopy() копирует перечислимое свойство _length и дополняет его объекту ресурса.

код выглядит примерно так:

DEMO

var DataResource = $resource('data.json', null, { 
    'getData': { 
     method: 'GET', 
     isArray: true, 
     transformResponse: function(response) { 
     var newData = JSON.parse(response); 

     newData.map(function(data) { 
      data._length = data.length; 
      return data; 
     }); 

     return newData; 
     } 
    } 
    }); 

    DataResource.getData(function(data) { 
    console.log(data); 
    }); 

Вы должны заметить, что в console.log(), это показывает, что каждый элемент ресурса объекта имеет _length свойство, которое вы можете использовать.

[] Другой способ заключается в использовании $http службы для данного конкретного случая использования, который является самым простым решением этой проблемы, что я мог думать.

$http.get('data.json').success(function(data) { 
    console.log(data); 
}); 

[] Для того, чтобы пересмотреть структуру данных ответа на что-то вроде этого:

[{ 
    item: [1,2,3,4,5] 
}, { 
    item: [1,2,3,4,5] 
}, { 
    item: [1,2,3,4,5] 
}, { 
    item: [1,2,3,4,5] 
}]; 

Тогда вы можете явно использовать $resource фабрику и итерацию по каждому объекту элемента массива с item ключ.

+0

Большое спасибо за подробный ответ, вы на правильном пути! Я попробовал ваш код, чтобы добавить длину, и это сработало. Я собираюсь либо использовать это, либо посмотреть на реструктуризацию моих данных, но оба варианта означают итерацию по всему набору, поэтому мне нужно будет увидеть, какая из них более эффективна. Еще раз спасибо! – dhalia

0

Можете ли вы предоставить код прием обработки ресурсов? Я предполагаю, что вы используете услугу $resource; Если вам нужны ваши данные (например, для целей обработки), вам необходимо учитывать асинхронный характер ответа: обращается к ресурсу $promise и обеспечивает обратный вызов для получения результатов. Код вероятно, будет выглядеть так:

myResouce.$promise.then(function(result) { 
    $scope.data = result; 
    console.log('length = ' + $scope.data.length); 
} 

Если вы на самом деле не нужны ваши данные, $resource немедленно возвращает пустой объект, который впоследствии будет заселен содержание ответа. Вы можете просто сделать var $scope.data = $resource(...); и использовать этот объект данных в своем средстве просмотра. Представление может начинаться пустым, но затем обновляться, когда данные фактически передаются на $scope.data из ответа $resource.

+0

Да, я использую обещание $ и пытаюсь выполнить итерацию данных после того, как у меня есть все это. Это формат, в котором данные возвращаются, и это проблема. – dhalia

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