2014-11-20 97 views
1

我做了一个基类,HttpService的响应:ngResource transformResponse似乎并没有被转化

class HttpService 
    constructor: (url) -> 
    @service = $resource url, {}, @actionOptions() 

    actionOptions: -> 
    query: 
     method: 'GET' 
     isArray: true 
     transformResponse: (data) => 
     response = [] 
     wrapped = angular.fromJson(data) 
     angular.forEach wrapped[@indexRoot], (item) => 
      response.push @jsonToModel(item) 
     response 

我继承这样的:

class FooService extends HttpService 
    constructor: -> 
    super '/api/foos/:id' 
    @indexRoot = 'foos' 

    all: -> 
    @service.query() 

    jsonToModel: (data) -> 
    new Foo(data) 

一般情况下,这个想法是延长HttpService的提供资源的URL和索引根(JSON具有索引操作的根元素)。我重写jsonToModel以提供将响应中的每个JSON元素转换为自定义对象的方法,在本例中为Foo

调试时,我可以看到response是应该在actionOptions()什么,所以好像transformResponse将返回我所期望的Foo秒的阵列。

虽然每次我打电话FooService.all(),但我得到的数组为Resource(ngResource默认值)...任何人都知道我在做什么错了?我已经省略了依赖注入和所有东西,但它都工作正常,并且在控制台中没有错误。

回答

2

$ resource服务使用在transformResponse之后发生的拦截器包装Resource对象中的响应,所以虽然transformResponse是解开根对象(从那里得到馈送到拦截器的结果)的好地方,但您会还需要一个拦截器来调用你的jsonToModel函数。

相关的文档: - {功能(数据,headersGetter)|阵列}

https://docs.angularjs.org/api/ngResource/service/ $资源

transformResponse - 变换函数或这些功能的阵列。转换函数采用http响应正文和标题,并返回其已转换(通常是反序列化)版本。默认情况下,transformResponse将包含一个函数,用于检查响应是否看起来像JSON字符串,并使用angular.fromJson对其进行反序列化。为了防止此问题,设置transformResponse为空数组:transformResponse:[]

拦截 - {对象=} - 拦截器对象具有两个可选的方法 - 响应和responseError。使用http响应对象调用response和responseError拦截器。请参阅$ http拦截器。