2014-02-14 3 views
7

Siehe die akzeptierte Antwort auf here für eine ziemlich gute Erklärung auf der transFormRequest Funktion/Array.

Im letzten Beispiel der Antwort:

var transform = function(data){ 
    return $.param(data); 
} 

$http.post("/foo/bar", requestData, { 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
    transformRequest: transform 
}).success(function(responseData) { 
    //do stuff with response 
}); 

jedoch das Problem dabei ist, dass transformRequest: transform das Array von Funktionen überschreiben die Angular hat vorge gebaut.

aus dem Winkel docs:

zu erweitern global oder die Standard Transformationen außer Kraft setzen, ändern Sie die $ httpProvider.defaults.transformRequest und $ httpProvider.defaults.transformResponse Eigenschaften. Diese Eigenschaften sind standardmäßig ein Array von Transformationsfunktionen, mit denen Sie eine neue Transformationsfunktion in die Transformationskette schieben oder nicht verschieben können. Sie können auch entscheiden, alle Standardtransformationen vollständig zu überschreiben, indem Sie diese Eigenschaften direkt diesen Eigenschaften ohne den Array-Wrapper zuweisen. Diese Standardwerte sind zur Laufzeit wieder in der $ http-Factory verfügbar. Dies kann nützlich sein, wenn Sie Runtime-Services haben, die Sie an Ihren Transformationen beteiligen möchten.

ähnlich lokal die Request/Response-Transformationen außer Kraft setzen, ergänzen die transformRequest und/oder transformResponse Eigenschaften des Objekts Konfiguration in $ http geben.

Wenn ich global meine Transformationsfunktion anwenden wollte, würde ich

$httpProvider.defaults.transformRequest.unshift(myFunction) 

oder

$httpProvider.defaults.transformRequest.push(myFunction) 

Meine Frage
Statt Löschen des gesamten Arrays tun Transformation von Anforderungsfunktionen, wie Sie eine andere Transformationsfunktion an einen Aufruf senden, nicht g lobal?

Antwort

17

fand ich eine einfache Lösung, die .concat Methode

{ 
    transformRequest: [function(req){...}].concat($http.defaults.transformRequest) 
} 

oder alternativ verwenden, wenn Sie Ihre individuelle Transformation wollen erfolgen nach Standardtransformationen eckigen.

{ 
    transformRequest: $http.defaults.transformRequest.concat([function(req){...}]) 
} 
1

Hier ist eine weitere Lösung dieses Problems:

.config(function($httpProvider) { 

     $httpProvider.defaults.transformRequest = function(data) { 

     var query = '', name, value; 
     if (data instanceof Object) { 

      for(key in data) { 

       name = key; 
       value = data[key]; 

       query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';     

      } 
      return query; 
     } else { 
      return data; 
     } 

     }; 

     $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; 

}) 

Hoffe, dass es helfen ist

3

Angular, in der Dokumentation dieser Vorschlag macht:

$httpProvider.defaults.transformRequest = appendTransform($httpProvider.defaults.transformRequest, function(data) { 
    //do whatever you want 
    return data; 
}); 

function appendTransform(defaults, transform) { 

    // We can't guarantee that the default transformation is an array 
    defaults = angular.isArray(defaults) ? defaults : [defaults]; 

    // Append the new transformation to the defaults 
    return defaults.concat(transform); 
}