5

ここに簡単$resourceな例があります(Angularサイトから適応):

angular.module('project', ['mongolab']);

function ListCtrl($scope, Project) {
  $scope.projects = Project.test();
}

angular.module('mongolab', ['ngResource']).
factory('Project', function ($resource) {
  var url, dfParams, actions;

  url = 'https://api.mongolab.com/api/1/databases' + '/angularjs/collections/projects/:id';
  dfParams = {
    apiKey: '4f847ad3e4b08a2eed5f3b54'
  };

  actions = {
    test: {
      method: 'GET',
      isArray: true,
      transformResponse: function (response) {
        // line is never getting called
        console.log('transforming');
        return response;
      }
  };

  var Project = $resource(url, dfParams, actions);
  return Project;
});

問題は、回線console.log('transforming')が呼び出されないことです。何故ですか?他のすべては正常に動作します。

ここでライブフィドル。

4

3 に答える 3

10

この機能は、AngularJs の 1.1.2 以降のバージョンでのみ使用できます。AngularJs の 1.1.1 以前のバージョンでは使用できません。

于 2013-03-17T00:15:33.207 に答える
2

応答変換コールバックは $resource サービスで公開されていません。基礎となる $http サービス内に存在します。

したがって、次の 2 つの選択肢があります。

  • $resource 抽象化の代わりに「低レベル」の $http を使用し、
  • リソースの周りにある種のラッパーを作成します。これにより、応答が希望どおりに変換されます。
于 2013-03-16T23:03:01.610 に答える
1

同じ問題があり、AngularJS 1.2.26 を使用しています。次のような $http レベル
を含むインターセプターを定義しました。transformResponse

return {
  'request': function (config) {
      config.defaults.transformResponse = function(data){
          //some has been done
      };
      return config;
},

上記のコードを削除すると、私transformResponseの $resource が機能しました!
この問題を解決するためにtransformResponse、$resource で次のように定義しました。

return $resource(pathConfig.serverURL + ':demoId',
    {
        demoId: "@id"
    },
    {
        hello: {
            method: "GET",
            url: serverDomain + ":demoId",
            transformResponse: addTransformResponses(
                [
                    function (data, getHeaders) {
                        //doing hello's OWN interceptors
                    }
                ])
        }
    });

次のような 一般的なインターセプターaddTransformResponsesが含まれています。

addTransformResponses: function (addTrans) {
    return [this.parseResponseJson, this.parseResponseArray]
        .concat(addTrans);
},

//parse JSON
parseResponseJson: function (data, getHeaders) {
    try {
        return angular.fromJson(data);
    } catch (e) {
        console && console.error("return data is not a JSON!");
        return data;
    }
},
parseResponseArray: function (data, getHeaders) {
    if (angular.isArray(data)) {
        return {"array": data};
    }
    return data;
}

こうすることで、共通のインターセプターと一部のリクエスト独自のインターセプターをうまく構成できます! :)
より良い練習があれば教えてください!ありがとう!

于 2014-10-14T06:34:47.063 に答える