18

我正在使用以这种格式返回 JSON 数据的 API:

{
    paging: {
        previous: null,
        next: null
},
    data: [
        { title: 'First Item' },
        { title: 'Second Item' },
        ...
    ]
}

我正在使用 Angular 的$resource服务来获取这些数据。
我的代码 - 位于控制器中 - 如下所示:

var Entity = $resource('/api/entities');
var entities = $scope.entities = Entity.get();

然后,在视图中,我可以像这样显示数据:

<ul>
  <li ng-repeat="entity in entities.data">{{entity.title}}</<li>
</ul>

一切正常,但是:

  • 我宁愿只entities.data向视图公开内容,而不是整个entities对象。如何拦截 GET 请求返回的数据以在填充之前$scope.entities对其进行修改?
  • 相关问题:由于我正在获取一数据,因此使用它Entity.query()而不是Entity.get(). 但是如果我Entity.query()在上面的代码中使用,我会收到一个错误“TypeError: Object # has no method 'push'”。这是有道理的,因为 API 返回的是对象而不是数组(因此,对象上没有“推送”方法)。同样,如果我可以.data从响应中提取属性,我将有一个数组。

根据Dan Boyon 的这些指示,我设法自定义默认$resource服务并覆盖 .get() 或 .query() 方法,但我不确定从那里去哪里。

4

2 回答 2

24

我认为您不需要修改 get 或 query 默认值。只需使用成功回调来做你想做的事。它也应该更健壮。

Entity.get(
    {}, //params
    function (data) {   //success
        $scope.entities = data.data;
    },
    function (data) {   //failure
        //error handling goes here
    });

Html 也会更干净:

 <ul>
      <li ng-repeat="entity in entities">{{entity.title}}</<li>
 </ul>

顺便说一句,我通常为我的资源声明服务,然后在需要时将它们注入到我的控制器中。

 myServices.factory('Entity', ['$resource', function ($resource) {
     return $resource('/api/entities', {}, {
     });
 }]);
于 2012-08-08T02:07:05.763 回答
1

您可以像这样使用响应转换器 (transformResponse):

$resource('/api/entities', {}, {
        query: {
            method: 'GET',
            responseType: 'json',
            isArray: true,
            transformResponse: function (response) {
                return response.data;
            }
        }
    });

这段代码修改了“查询”方法的行为,你可以对“获取”做同样的事情......!

于 2016-06-06T18:24:51.307 回答