Преобразование AngularJSResponse

В ресурсе angularjs я хотел бы преобразовать мои json-данные в объекты JS

//Complex object with inheritance chain
function Car(year, make){
    this.make = make;
    this.year = year;
}


var carResource = $resource("/api/car/id", {id: '@id'},
    {
        get: {
            method: 'GET',
            transformResponse: function(data, headersGetter){
                return new Car(data.make, data.year);
            }
        }
    }
)

Однако это, похоже, не происходит

То, что я возвращаю, это объект $resource, означающий, что свойства make и year установлены правильно, однако прототип возвращаемого объекта указывает на $resource

Есть ли способ, с помощью которого я могу сопоставить мои данные json непосредственно с моими собственными объектами?

Или мне нужно написать собственную реализацию ресурса?

Ответ 1

transformResponse выполняется на уровне $http.

При настройке действий $resource с настраиваемым объектом конфигурации этот объект фактически передается в базовую службу $http. Поэтому, если вы укажете обратный вызов transformResponse, он будет выполнен на уровне $http, и результаты вашего преобразования будут переданы обратно в $resource.

Служба ресурсов

$будет создавать новый объект из ваших данных ответа (который уже преобразован обратным вызовом transformResponse), и этот новый объект будет экземпляром самого ресурса $.

Итак, ваш car объект будет быть экземпляром car, но только на мгновение, пока его свойства не будут скопированы в новый объект $resource.

Здесь упрощенный вид процесса:

  • $resource service инициирует запрос
  • $http service отправляет запрос и получает ответ
  • $http service преобразует ответ (ответ теперь является экземпляром car)
  • $resource service получает преобразованный ответ (от $http)
  • $resource service делает экземпляр себя с использованием преобразованных свойств ответа (результат теперь является экземпляром $resource)

Во всяком случае, я не рекомендую украшать или расширять службу $resource, потому что проще написать собственную реализацию, используя службу $http.