2015-01-26 137 views
11

默认情况下,$resource.query()设置为期望一个对象数组成为$resource对象。为了适应寻呼在一个不错的,宁静的方式,我有我的GET /api/widgets端点设置返回以下对象:

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

有没有办法让这个角会知道items属性是数组物品是$resource物品?

回答

22

你需要指定自己的自定义操作。

我想,你的代码看起来是这样的:

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

这工作得很好! – 2015-01-26 19:11:23

+0

因此,通过这种方法,我如何从transformResponse方法的外部访问分页信息?你肯定已经回答了原来的问题,但现在我有一个新的问题:) – 2015-01-26 19:22:22

+0

不完全确定,但你可以试试'var widgets = Widget.query(); widgets。$ promise.then(function(data){console.log(data);});'。 – 2015-01-26 19:33:19

2

简单的就是使用$resouce.get,如果你要使用查询,你可以重写该行为。

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

更多信息https://docs.angularjs.org/api/ngResource/service/ $资源

+0

这并不能解决我的问题。整个响应对象将是一个'$ resource',并尝试调用'$ save'或'$ update'将尝试保存不属于实际资源模型的值。我需要配置'$ resource.query()'来知道实际的资源对象包含在响应的'items'数组中。 – 2015-01-26 18:25:31

+0

我已经做到了这一点,并为我工作,我不知道它是如何工作的,当你打电话给更新你会speciy id和新对象,我看不到它将不会工作'myresource.update({id:1 }。{propery1:1,property2:2})' – 2015-01-26 18:35:36

+0

如果我严格使用'$ resource'作为构造请求和获取响应对象的机制,这将起作用,但是,还有'$ resource'的其他特性这些并不被广泛理解。具体来说,REST端点返回的对象本身就变成了'$ resource'对象。在我的情况下,我需要一种方法来告诉角度,返回对象的'list'属性是实际的资源。看到接受的答案。 – 2015-01-26 19:15:22

0

我有同样的问题,我想提出这可能是一个解决方案好一点:

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

我认为这可能会更好,因为你正在重用的标准角度behav我(其实,它实际上只是做了一点点比fromJson)并拦截输出结果来筛选你想要的。

0

我使用此模式进行查询与寻呼信息。

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 
    }; 
}) 
相关问题