2015-04-11 5 views
1

Я столкнулся с службой Angular.js по имени $httpParamSerializer и подумал, что это может быть полезно для моего кода. Однако, когда я попытался ввести его, Angular.js не узнал его и выбросил ошибку «неизвестного провайдера».

Не $httpParamSerializer a встроенный сервис (как $http)? Почему это происходит?

У меня нет никаких проблем с инъекционными другими встроенными сервисами, такими как $http, $httpBackend и т.д.

Спасибо.

ответ

5

Он был совсем недавно добавлен в Angular v1.4.0-rc.0. - так, проверить и исправить версию Угловой:

<script src="https://code.angularjs.org/1.4.0-rc.0/angular.js"> 
2

Я нуждался в этом тоже, но на данный момент мы не можем модернизировать, так что я просто взял код и создал поставщик и добавил его в мой «общий» модуль. Как только мы обновим, я просто удалю его.

(function (angular) { 

    'use strict'; 

    var serviceId = '$httpParamSerializer'; 

    var common = angular.module('common'); 

    common.provider(serviceId, $HttpParamSerializerProvider); 


    function $HttpParamSerializerProvider() { 

     function sortedKeys(obj) { 
      return Object.keys(obj).sort(); 
     } 

     function forEachSorted(obj, iterator, context) { 
      var keys = sortedKeys(obj); 
      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 (isObject(v)) { 
       return isDate(v) ? v.toISOString() : toJson(v); 
      } 
      return v; 
     } 

     function isUndefined(value) { return typeof value === 'undefined'; } 

     var isArray = Array.isArray; 

     function isObject(value) { 
      // http://jsperf.com/isobject4 
      return value !== null && typeof value === 'object'; 
     } 

     /** 
    * @ngdoc service 
    * @name $httpParamSerializer 
    * @description 
    * 
    * Default {@link $http `$http`} params serializer that converts objects to strings 
    * according to the following rules: 
    * 
    * * `{'foo': 'bar'}` results in `foo=bar` 
    * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) 
    * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) 
    * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object) 
    * 
    * Note that serializer will sort the request parameters alphabetically. 
    * */ 

     this.$get = function() { 
      return function ngParamSerializer(params) { 
       if (!params) return ''; 
       var parts = []; 
       forEachSorted(params, function(value, key) { 
        if (value === null || isUndefined(value)) return; 
        if (isArray(value)) { 
         forEach(value, function(v, k) { 
          parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v))); 
         }); 
        } else { 
         parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value))); 
        } 
       }); 

       return parts.join('&'); 
      }; 
     }; 




    } 
}(angular)) 
+0

Спасибо, это решение сработало и для меня. Если кому-то интересно, у меня есть пример того, как вы можете использовать его вместо этого [здесь] (https://gist.github.com/karlr42/f566405cf7c59319cd2fe31c3d2d9a85), но это та же идея. – user3806049

Смежные вопросы