11

我创建了一个角度服务来与一个用 PHP 制作的简单 REST 服务器对话。我可以看到我能够获取单个记录、所有记录的列表并添加新记录,但是,在添加新记录之后,我在从服务器获取正确响应以对其进行操作时遇到问题。

我知道它正在工作,因为正在添加新记录,但是,如果由于某种原因请求不起作用,我希望向用户发出通知,等等......

这是服务:

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);
};

通过 javascript 控制台看到的来自 HTTP 请求的网络响应返回从服务器返回的“true”,但是,console.log(result) 返回“true”中的字符数组——我猜到了是因为 'save' 中的 isArray : true 选项是必要的,因为参数作为数组发送到服务器:

[$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 响应是一个 true 的 json 值,如果我可以挂钩它会很容易(我来自 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);
};

但我仍然没有得到真实的回应

4

2 回答 2

13

看到这个小提琴: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

于 2013-07-02T04:51:05.167 回答
0

嗨,我知道它为时已晚,但可能对其他人有帮助,将响应转换为数组的原因是,角度资源期望“数据”属性作为响应,然后迭代“数据”中的每个项目,但如果你发送像这样来自服务器的数据属性内的字符串

response = {
    data: true
    }

然后 Angular-resource 遍历“数据”对象并生成一个数据数组,正确的方法是发送响应是这样的

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

谢谢

于 2015-07-03T10:28:48.407 回答