Не удается прочитать ответ от AngularJS $resource DELETE

Я пытаюсь использовать AngularJS $resource для УДАЛЕНИЯ данных с моего сервера. Однако, когда я записываю результат в консоль, я не вижу данных.

Однако, когда я захожу в «Сеть» в консоли Chrome, я вижу DELETE в левом столбце «Путь к имени». Когда я нажимаю «Информация», я вижу пять вкладок на правой панели. На вкладках «Предварительный просмотр» и «Ответ» я вижу правильные данные. Я просто не знаю, как увидеть или получить это в своем Javascript.

Вот код службы javascript:

var MyServices = angular.module('MyServicesName', ['ngResource']);

MyServices.factory('AAAService', function($resource) {
    return $resource(serverBaseUrl + 'users/:userId/Video/:videoId/', {userId: '@userId', videoId: '@videoId'}, {
        show: {method: 'GET'},
        update: {method: 'PUT', params: {id: '@id'}},
        delete: {method: 'DELETE', isArray:false}
    });
});

И Контроллер:

quizcatControllers.controller('BBBCtrl', ['$scope', '$stateParams', '$http', 'AAAService',
    function($scope, $stateParams, $http, AAAService) {
$scope.deleteQuestion = function(user, videoId) {
             AAAService.delete({userId: user, videoId: videoId}, function(a, b) {
        console.log(a);//Expect to print the data
        console.log(b);
});

Может ли кто-нибудь предложить, как следует изменить мой код, чтобы я мог получать данные из ответа? Хотя мои данные ответа не в формате массива, я хотел бы знать, как это сделать как для массива, так и для стиля массива.

Какими должны быть имена собственные вместо a и b в следующей строке:

AAAService.delete({userId: user, videoId: videoId}, function(a, b) {

ОБНОВЛЕНИЕ:

Это результат, который я получаю в обратном вызове успеха для параметра returnValue:

0: "S"
1: "u"
2: "c"
3: "e"
4: "s"
5: "s"
$promise : Объект
$resolved: true
proto: Ресурс


person Randall Flagg    schedule 20.05.2014    source источник


Ответы (1)


Использование ресурсов может быть немного запутанным (по крайней мере, они изначально были для меня).

Я думаю, ваша проблема в том, что ваш вызов для удаления не использует правильную подпись (существуют разные подписи для методов «GET» и «не-GET». В этом случае похоже, что вы отправляете то, что предназначено для ваша функция обратного вызова (для успеха и ошибки) как postData.Подпись, которую вы использовали, предназначена для методов «GET» (у которых нет postData).

Подпись для вашего запроса на удаление должна выглядеть так (см. документацию здесь):

Resource.action([параметры], postData, [успех], [ошибка])

Итак, вы можете сделать что-то вроде этого:

quizcatControllers.controller('BBBCtrl', ['$scope', '$stateParams', '$http', 'AAAService', 
function($scope, $stateParams, $http, AAAService) {
    $scope.deleteQuestion = function(user, videoId) {
        AAAService.delete(
            {userId: user, videoId: videoId},  // parameters
            {},                                // postData, which you don't need for this
            // success callback
            function (returnValue, responseHeaders) {
                // do what you want with the returnValue from the call here
            },
            // error callback
            function (httpResponse) {
                // do what you want for error handling here
            })
    };
}]);
person RobM    schedule 20.05.2014
comment
Спасибо, это немного исправляет мой код. Проблема в том, что возвращаемое значение имеет тип Resource. Как я могу получить реальное значение (строку)? - person Randall Flagg; 21.05.2014
comment
Вы пробовали AAAService.delete(...).then(function(data) { console.debug(data) })? - person link; 21.05.2014
comment
@ссылка да. Я получаю результат, показанный в ОБНОВЛЕНИИ - person Randall Flagg; 21.05.2014
comment
Странно, у вас должны получаться только данные, а у вас, кажется, весь ресурс. - person link; 21.05.2014
comment
Что вы используете для своего API? Я подозреваю, что вы возвращаете просто строку, а не объект (JSON). Например, если ваш API просто возвращает строку Success, я думаю, что она сериализуется (или просто десериализуется) в массив символов, что вы и видите в своем результате. Вместо этого обычно следует возвращать объекты, такие как { 'result': 'success' }. Затем в вашем успешном обратном вызове получите доступ к returnValue.result. Получение $promise и $resolved — это нормально, но вам не нужно о них беспокоиться. - person RobM; 21.05.2014
comment
@RobM Я использую json_encode (успех) в PHP. Это правильно? - person Randall Flagg; 21.05.2014
comment
Это правильно, что это то, что вызывает вашу проблему. Это приводит к сериализации вашей строки в массив символов. Это предназначено для кодирования объекта как JSON, например, в моем последнем комментарии. Вы не должны просто json_encode строку. Вместо этого вы можете просто вернуть строку, как я написал в последнем комментарии, или json_encode объект со свойством, которое имеет ваш результат. - person RobM; 21.05.2014
comment
Хотя я не специалист по PHP, думаю, вы могли бы сделать что-то вроде этого: $retObj = new stdClass; $retObj-›operationResult = 'успех'; затем верните json_encode($retObj) в свой API. Затем в Angular получите доступ к своему значению, используя returnValue.operationResult - person RobM; 21.05.2014
comment
Это решило проблему. Большое спасибо за помощь. - person Randall Flagg; 22.05.2014