Поведение вы испытываете каким-то образом связано с тем, что в $resource
query()
, в котором ожидалось, данные отклика представляет собой массив, каждый элемент данных в массиве превращается в объект 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
ключ.
Большое спасибо за подробный ответ, вы на правильном пути! Я попробовал ваш код, чтобы добавить длину, и это сработало. Я собираюсь либо использовать это, либо посмотреть на реструктуризацию моих данных, но оба варианта означают итерацию по всему набору, поэтому мне нужно будет увидеть, какая из них более эффективна. Еще раз спасибо! – dhalia