2016-07-29 9 views
1

Wie kann ich einen benutzerdefinierten $ http Params Serializer erstellen. Zum Beispiel unter der Annahme, im folgenden Aufruf machen:

$http({ 
      url: settings.API_PRODUCTS, 
      method: 'GET', 
      params: data, 
      paramSerializer: '$httpParamSerializerJQLike' 
     }); 

Wie kann ich einen neuen benutzerdefinierten Serializer erstellen, so dass ich in der Lage wäre, es so zu verwenden:

$http({ 
      url: settings.API_PRODUCTS, 
      method: 'GET', 
      params: data, 
      paramSerializer: '$httpParamCustomSerializer' 
     }); 

Ich habe, wie die httpParamSerializerJQLike Funktion ist written, aber ich bin nicht sicher, wie man wie oben injizieren und verwenden kann.

Antwort

1

Dies sollte es tun, erstellen Sie einen benutzerdefinierten Anbieter

angular.module('yourmodule.providers').provider('$httpCustomParamSerializer', function $httpCustomParamSerializer() { 

    this.$get = function() { 
    return function jQueryLikeParamSerializer(params) { 
     if (!params) return ''; 
     var parts = []; 
     serialize(params, '', true); 
     return parts.join('&'); 

    function forEachSorted(obj, iterator, context) { 
     var keys = Object.keys(obj).sort(); 
     for (var i = 0; i < keys.length; i++) { 
      iterator.call(context, obj[keys[i]], keys[i]); 
     } 
     return keys; 
    } 

    function encodeUriQuery(val, pctEncodeSpaces) { 
     return encodeURIComponent(val). 
       replace(/%40/gi, '@'). 
       replace(/%3A/gi, ':'). 
       replace(/%24/g, '$'). 
       replace(/%2C/gi, ','). 
       replace(/%3B/gi, ';'). 
       replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); 
    } 

    function serializeValue(v) { 
    if (angular.isObject(v)) { 
     return angular.isDate(v) ? v.toISOString() : angular.toJson(v); 
    } 
    return v; 
    } 

     function serialize(toSerialize, prefix, topLevel) { 
     if (toSerialize === null || angular.isUndefined(toSerialize)) return; 
     if (angular.isArray(toSerialize)) { 
      angular.forEach(toSerialize, function(value, index) { 
      serialize(value, prefix + '[' + (angular.isObject(value) ? index : '') + ']'); 
      }); 
     } else if (angular.isObject(toSerialize) && !angular.isDate(toSerialize)) { 
      forEachSorted(toSerialize, function(value, key) { 
      serialize(value, prefix + 
       (topLevel ? '' : '[') + 
       key + 
       (topLevel ? '' : ']')); 
      }); 
     } else { 
      parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize))); 
     } 
     } 
    }; 
    } 

}); 
1

Gemäß the documentation können Sie der Eigenschaft paramSerializer entweder eine Inline-Funktion zuweisen oder einen Funktionsservice erstellen und diesen Namen mit einer Zeichenfolge referenzieren.