web-dev-qa-db-ja.com

$ resource.queryを使用して、実際のリソースの配列を含むオブジェクトを返したい

デフォルトでは、$resource.query()は、$resourceオブジェクトになるオブジェクトの配列を期待するように設定されています。素敵で落ち着いた方法でページングに対応するために、次のオブジェクトを返すようにGET /api/widgetsエンドポイントを設定しています。

{
  currentPage: 1,
  perPage: 20,
  totalItems: 10039,
  items: [{...}, {...}, {...}]
}

angularがitemsプロパティが$resourceオブジェクトになるアイテムの配列であることを認識できるようにする方法はありますか?

11
w.brian

独自のカスタムアクションを指定する必要があります。

あなたのコードは次のようになっていると思います。

factory('Widget', function($resource) {
  return $resource('/api/widgets');
});

これに変更します:

factory('Widget', function($resource) {
  return $resource(/api/widgets, null, {
    query: {
      method: 'GET',
      isArray: true,
      transformResponse: function(data) {
        return angular.fromJson(data).items;
      }
    }
  });
});
23
Remco Haszing

簡単なのは$resouce.getを使用することでした。クエリを使用したい場合は、その動作をオーバーライドできます。

$resource('/notes/:id', null,
{
    'query':  {method:'GET', isArray:false}
});

詳細 https://docs.angularjs.org/api/ngResource/service/ $ resource

2
bto.rdz

私は同じ問題を抱えていたので、もう少し良い解決策を提案したいと思いました。

factory('Widget', function($resource) {
    return $resource(/api/widgets, null, {
        query: {
            interceptor: {
                response: function(response) {
                    return response.data.items;
                }
            }
        }
    }
}

標準のangularの動作(実際には、fromJsonより少し多くのことを実行)を再利用し、出力結果をインターセプトして何をフィルタリングするので、より良いかもしれないと思いますあなたが欲しい。

0
Edouard Berthe

このパターンは、ページング情報を使用したクエリに使用します。

module.config(function($resourceProvider){
    $resourceProvider.defaults.actions.query = {
        method: 'GET',
        interceptor: {
            response: function(response) {
                response.resource.$totalCount = response.data.totalCount;
                response.resource.$limit = response.data.limit;
                response.resource.$offset = response.data.offset;
                return response.resource;
            }
        },
        transformResponse: function(data, headers, status) {
            var out = angular.fromJson(data);
            out.data.totalCount = out.totalCount;
            out.data.limit = out.limit;
            out.data.offset = out.offset;
            return out.data;
        },
        isArray: true
    };
})
0
Martin Mytny