Подтвердить что ты не робот

AngularJS с ngResource: как проверить точный ответ с сервера?

Я создал службу angular, чтобы поговорить с простым сервером REST, созданным на PHP. Я вижу, что я могу получить одну запись, список всех записей и добавлять новые записи, однако после добавления новых записей у меня возникает проблема с получением правильного ответа с сервера, чтобы иметь возможность действовать.

Я знаю, что он работает, потому что новые записи добавляются, однако я хочу размещать уведомления для пользователей, если по какой-либо причине запрос не работает, и так далее...

Это сервис:

angular.module('adminApp.services', ['ngResource'])

    .factory('Settings', function($resource) {

        return $resource('rest/setting/:id', {id: '@id'}, {
            'query' : { method: 'GET', params: {}, format: 'json', isArray: true },
            'save'  : { method: 'POST', params: {}, format: 'json', isArray: true },
            'get'   : { method: 'GET', params: {}, format: 'json', isArray: false },
            'update': { method: 'PUT', params: {id: '@id'}, format: 'json', isArray: true },
            'delete': { method: 'DELETE', params: {id: '@id'}, format: 'json', isArray: false }
    });

});

Как часть контроллера, у меня есть следующее:

$scope.save = function() {
    var result = Settings.save({}, $scope.settings);

    console.log(result);

    // Here I would like to send the result to the dialog
    // to determine wether or not the request was successful
    // dialog.close(result);
};

Ответ сети HTTP-запроса, как видно через консоль javascript, возвращает 'true', который возвращается с сервера, однако console.log(result) возвращает массив символов в 'true' - я предположил, что это из-за параметра isArray: true в "save", что необходимо, потому что params отправляются на сервер как массив:

[$promise: Object, $resolved: false]
    0: "t",
    1: "r",
    2: "u",
    3: "e",
    $promise: Object,

    // I tried passing result.$resolved to the dialog,
    // but if yousee above it resolves to false up top first
    $resolved: true,
    length: 4,
    __proto__: Array[0]

Я знаю, что ответ HTTP - это значение json true, если бы я мог зацепиться за это, было бы легко (я исхожу из фона jQuery, возможно, я делаю это неправильно, я сделал это для удаления jQuery полностью из этого проекта, чтобы не позволить ему препятствовать моему обучению).

Я думаю, вопрос в том, как я могу получить этот ответ с сервера на переменную JS, с которой я действительно могу работать?

Изменить: обновлено

Я изменил свой сервис на:

angular.module('adminApp.services', ['ngResource'])
    .factory('Settings', function($http, $resource, $log) {
        return $resource('rest/setting/:id', {id: '@id'}, {
            save   : {
            method: 'POST',
            params: {},
            format: 'json',
            isArray: true,
            transformResponse: [function(data, headersGetter) {
                $log.info(data); // returns true
                return { response: data };
            }].concat($http.defaults.transformResponse)
        },
        update : { method: 'PUT', params: {id: '@id'}, format: 'json', isArray: true },
        delete : { method: 'DELETE', params: {id: '@id'}, format: 'json', isArray: false }
    });

});

И вызов:

$scope.save = function() {
    $scope.results = Settings.save({}, $scope.settings);
    console.log($scope.results); // Still returns the response with $promise
    //dialog.close(true);
};

Но я все еще не понимаю, как ответ

4b9b3361

Ответ 1

Смотрите эту скрипту: http://jsfiddle.net/moderndegree/Kn3Tc/

angular.module('myApp', ['ngResource']).
factory('myService', function($http, $resource, $log){
    return $resource('/', {}, {
        get: {
            method: 'GET',
            transformRequest: [function(data, headersGetter){
                // you can examine the raw request in here
                $log.info(data);
                $log.info(headersGetter());
            }].concat($http.defaults.transformRequest),
            transformResponse: [function (data, headersGetter) {
                // you can examine the raw response in here
                $log.info(data);
                $log.info(headersGetter());
                return {tada:"Check your console"};
            }].concat($http.defaults.transformResponse)
        }
    });
}).
controller('myController', function(myService, $scope, $resource, $http, $log) {
    $scope.results = myService.get();
});

Чтобы глобально увеличить или переопределить преобразования по умолчанию, измените $httpProvider.defaults.transformRequest и $httpProvider.defaults.transformResponse.

читайте больше здесь: http://docs.angularjs.org/api/ng. $http

Ответ 2

Привет, я знаю его слишком поздно, но может быть полезен для других, Причина преобразования ответа в массив заключается в том, что angular -resource ожидает свойства "данные" в ответ, и после этого он перебирает все элементы внутри "данных", но если вы отправляете строку внутри свойства данных с сервера, как это, /p >

response = {
    data: true
    }

затем angular -ресурсы итерации по объекту "данные" и делает массив данных таким образом, правильный способ отправки ответа подобен этому

response = {
    data: {users: users} // Or any other property but not directly data
    }

Спасибо