2016-01-12 1 views
0

Я хочу изменить некоторые данные перед отправкой их на сервер через ng-resource. Я использую tranformRequest-Function, как это:Angularjs: преобразовать данные перед отправкой с помощью ng-resource и transformRequest

update: { 
     method: 'PUT', 
     transformRequest: function (data) { 
      // modify data then 
      return data; 
     } 
    } 

я могу изменить данные таким образом, но в запросе мои данные всегда сериализованная. Я хочу сохранить свои данные как JSON. Возможно ли это с помощью transformRequest или это нужно сделать в контроллере. Я бы предпочел сделать это на службе. Thx для справки

ответ

0

Да, это так. Немного хлопотно и ulgy, но вот это:

// from angular-resource 
var toString= function() { 
    var value = []; 
    _.forEach(this, function(e) { 
      value.push('' + e); 
      }); 
     return '[' + value.join(', ') + ']'; 
     }; 
     var isObject = function isObject(value) { 
      // http://jsperf.com/isobject4 
      return value !== null && typeof value === 'object'; 
     }; 
    var isFile = function(obj) { 
     return toString.call(obj) === '[object File]'; 
    } 


    var isFormData = function(obj) { 
     return toString.call(obj) === '[object FormData]'; 
    } 


    var isBlob = function(obj) { 
     return toString.call(obj) === '[object Blob]'; 
    } 
    var defaultToJson = function(d) { 
      return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? angular.toJson(d) : d; 
    }; 
    this.typeServiceProcessData = function(d){ 
      //[put your code here for to change data this will be called before angular default serialization to the server] 
    }; 
    this.typeServiceProcessJsData = function(d){ 
     //[for data that come back from the server after getting parse by default angular json parsing] 
    }; 


// sample creation of a resource method, be really carefull about the order in transformResponse and transformRequest 

'get': {method:'GET', transformResponse:[$http.defaults.transformResponse[0], this.typeServiceProcessData]}, 

'create': {method:'POST', url:baseResourceUrl, transformRequest:[this.typeServiceProcessJsData, defaultToJson]}, 

Это большой огромный, это код, который я сделал некоторое время назад, и я копировать/вставить некоторые функции определения от углового-ресурса, поскольку они не определяют, что и не были доступны из-за пределов углового ресурса. Чтобы узнать, зачем они нужны, проверьте установленную по умолчанию функцию ToJson, которая является угловым значением по умолчанию.

Если кто-то лучший способ просто скопировать вставить эту кучу функции я взять тоже :)

+0

ти я дам ему попробовать –

4

OMG я чувствую себя идиотом. Вам просто нужно сделать

update: { 
    method: 'PUT', 
    transformRequest: function (data) { 
     // modify data then 
     return angular.toJson(data); 
    } 
} 
+0

CAREFULL это не будет работать во всех случаях, если проверка реализации моего defaultToJson (который с угловым-ресурса) вы видите, что использовать какое-либо условие, прежде чем usung, что угловой .toJson). Так что это может сработать для вас, но это не сработает, потому что у меня есть более сложный ответ. – Walfrat

+0

Хорошо, я это рассмотрю. Ty –

3

Вот пример, который я использую в своем приложении. Абоненты методов $resource передают простой список параметров как JSON, а transformRequest связывает параметры в формат, ожидаемый API, который я использую.

var myServices = angular.module('myServices', ['ngResource']); 
... 
myServices.factory('MyServer', ['$resource', function($resource){ 
    var formatLoginRequest = function(data) { 
     // input looks like: {username:"imauser", pw:"password"} 
     // output should be: {request: {cmd:"login", username:"imauser", pw:"password"}} 
     data.cmd="login"; 
     data = {request: data}; 
     data = angular.toJson(data); 
     return data; 
    }; 
    ... 
    return = $resource('https://api.server.com/', {}, { 
     login: {method:'POST', params:{}, isArray:false, transformRequest:formatLoginRequest }, 
     ...other methods defined here... 
}); 

Как уже отмечалось, angular.toJson() не правильно сериализовать все типы данных, но достаточно для моего случая с JSON.

0

В случае, если кто-то еще сталкивается с этим, Angular обеспечивает преобразования по умолчанию для объектов. Служба $ http предоставляет defaults.transformRequest, которая проверяет, является ли свойство данных объектом и автоматически сериализует его в JSON.

Для этого конкретного случая я бы сделал простую проверку, если данные являются объектом, а если не сделать его одним и переопределить $ http.defaults.transformRequest.

function appendTransform(defaults, transform) { 
    defaults = angular.isArray(defaults) ? defaults : [defaults]; 
    return defaults.concat(transform); 
}; 

update: { 
    method: 'PUT', 
    transformRequest: 
appendTransform($http.defaults.transformResponse,function(data) { 
     data = angular.isObject(data) ? data : {data}; 
     return data; 
    }) 
} 
Смежные вопросы