2016-12-26 5 views
0

Вот мой метод фабрики:

.factory('lettersFactory', ['$resource', function ($resource) { 
 
\t var url = ""; 
 
    if(ionic.Platform.isAndroid()){ 
 
     url = "/android_asset/www/"; 
 
    } 
 
    return $resource(url + 'data/letters.json'); 
 
}])

А вот контроллер:

.controller('LettersCtrl', ['$scope','lettersFactory', '$stateParams', '$state', '$ionicPopover', function($scope, lettersFactory, $stateParams, $state, $ionicPopover) { 
 
    
 
     $scope.letters = lettersFactory.query(); 
 
     $scope.letter = lettersFactory.get({number:parseInt($stateParams.letterId, 10)}); 
 
}])

И вот сообщение об ошибке:

Ошибка в конфигурации ресурсов для действия object. Ожидаемый ответ содержит массив, но получил GET (запрос: данные/letters.json {4})

И мой letter.json массив так:

[ 

{"number":1, 
    "title": "title", 
    "content": "content"}, 
{"number":1, 
    "title": "title", 
    "content": "content"} 
] 

Благодаря

+0

проверить является ли ответ является массивом или нет .. –

ответ

0

Метод по умолчанию набор для $resource содержит следующие действия 1:

{ 'get': {method:'GET'}, 
    'save': {method:'POST'}, 
    'query': {method:'GET', isArray:true}, 
    'remove': {method:'DELETE'}, 
    'delete': {method:'DELETE'} }; 

В вашем случае метод get не удается, так как данные из XHR является массивом и метод ожидает объект.

Метод query преуспевает, потому что данные из XHR являются массивами, и метод ожидает массив.

Используйте метод get для данных объекта; используйте метод query для данных массива.


Update

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

Один подход заключается в использовании $promise свойства возвращенного объекта ресурса:

$scope.array = lettersFactory.query(); 

$scope.array.$promise.then(function(resourceArray) { 
    $scope.item = resourceArray[0]; 
}); 

Важно понимать, что применение метода в $resource объекте немедленно возвращает пустую ссылку (объект или массив в зависимости от isArray). Как только данные возвращаются с сервера, существующая ссылка заполняется фактическими данными.

Экземпляры ресурсов и коллекции имеют дополнительные свойства:

  • $promise: в promise исходного сервера взаимодействия, который создал данный экземпляр или коллекцию.

    При успешном выполнении обещание разрешено с помощью экземпляра экземпляра или объекта ресурса, обновленного данными с сервера.

    При отказе обещание отклоняется с помощью объекта ответа HTTP без свойства ресурса.

Для получения дополнительной информации см AngularJS $resource API Reference

+0

Как вы думаете, я могу использовать 'query' в этой ситуации, чтобы получить конкретный объект из данных массива? Я изменил 'lettersFactory.get ({number: parseInt ($ stateParams.letterId, 10)}); '' 'commentsFactory.query ({number: parseInt ($ stateParams.letterId, 10)});' но все равно идет. –

+0

См. Обновление ответа. – georgeawg

+0

Спасибо @georgeawg. Я попробовал, и это сработало. –

1

Если ответ не должен быть массивом, вам нужно установить isArray как false в свойстве запроса.

'query': {method: 'GET', isArray: false } 

См. Документ. https://docs.angularjs.org/api/ngResource/service/ $ resource

Или вы можете передать массив json as из контроллера.

+0

letter.json является массив JSON, поэтому я хочу, чтобы иметь возможность получить полный массив с запросом() и один объект с методом get(). Я изменил так: return $ resource (url + 'data/letters.json', {'query': {method: 'GET', isArray: false}}) ;, но он все равно дает такую ​​же ошибку. –

+0

@Awa подтвердите это один раз http://stackoverflow.com/questions/24409220/error-in-resource-configuration-expected-response-to-contain-an-object-but-got –

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