2016-07-29 14 views
1

カスタム$ http paramsシリアライザを作成する方法を教えてください。たとえば、次の呼び出しを行うイムと仮定すると:

$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プロパティにインライン関数を提供することも、関数サービスを作成して名前で文字列を参照することもできます。

関連する問題