2016-07-29 35 views
1

如何創建自定義$ http params串行器。例如,假設IM做以下電話:

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

如何創建新的自定義序列化,這樣我就可以使用這樣的:

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

我查怎麼httpParamSerializerJQLike功能是written,但我不知道如何注入並能夠像上面一樣使用。

回答

1

這應該這樣做,創建自定義提供

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

根據the documentation,您可以爲paramSerializer屬性提供內聯函數,也可以通過名稱和字符串創建函數服務和引用。