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」の文字の配列を返します-私はこれを推測しました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 応答が 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 に答える