diff --git a/src/ng/http.js b/src/ng/http.js index a4e2094ab203..a3eedd565924 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -122,6 +122,9 @@ function $HttpParamSerializerJQLikeProvider() { (topLevel ? '' : ']')); }); } else { + if (isFunction(toSerialize)) { + toSerialize = toSerialize(); + } parts.push(encodeUriQuery(prefix) + '=' + (toSerialize == null ? '' : encodeUriQuery(serializeValue(toSerialize)))); } diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index 7ed6993c4109..b87d5750abdb 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -2364,17 +2364,41 @@ describe('$http param serializers', function() { expect(decodeURIComponent(jqrSer({a: 'b', foo: ['bar', 'baz']}))).toEqual('a=b&foo[]=bar&foo[]=baz'); }); + it('should serialize arrays with functions', function() { + expect(jqrSer({foo: [valueFn('bar')]})).toEqual('foo%5B%5D=bar'); // foo[]=bar + }); + + it('should serialize arrays with functions inside objects', function() { + expect(jqrSer({foo: {bar: [valueFn('baz')]}})).toEqual('foo%5Bbar%5D%5B%5D=baz'); // foo[bar][]=baz + }); + it('should serialize objects by repeating param name with [key] suffix', function() { expect(jqrSer({a: 'b', foo: {'bar': 'barv', 'baz': 'bazv'}})).toEqual('a=b&foo%5Bbar%5D=barv&foo%5Bbaz%5D=bazv'); //a=b&foo[bar]=barv&foo[baz]=bazv }); + it('should serialize objects with function properties', function() { + expect(jqrSer({a: valueFn('b')})).toEqual('a=b'); + }); + + it('should serialize objects with function properties returning an object', function() { + expect(jqrSer({a: valueFn({b: 'c'})})).toEqual('a=%7B%22b%22:%22c%22%7D'); //a={"b":"c"} + }); + it('should serialize nested objects by repeating param name with [key] suffix', function() { expect(jqrSer({a: ['b', {c: 'd'}], e: {f: 'g', 'h': ['i', 'j']}})).toEqual( 'a%5B%5D=b&a%5B1%5D%5Bc%5D=d&e%5Bf%5D=g&e%5Bh%5D%5B%5D=i&e%5Bh%5D%5B%5D=j'); //a[]=b&a[1][c]=d&e[f]=g&e[h][]=i&e[h][]=j }); + it('should serialize nested objects with function properties', function() { + expect(jqrSer({foo: {bar: valueFn('barv')}})).toEqual('foo%5Bbar%5D=barv'); //foo[bar]=barv + }); + + it('should serialize nested objects with function properties returning an object', function() { + expect(jqrSer({foo: {bar: valueFn({bav: 'barv'})}})).toEqual('foo%5Bbar%5D=%7B%22bav%22:%22barv%22%7D'); //foo[bar]={"bav":"barv"} + }); + it('should serialize objects inside array elements using their index', function() { expect(jqrSer({a: ['b', 'c'], d: [{e: 'f', g: 'h'}, 'i', {j: 'k'}]})).toEqual( 'a%5B%5D=b&a%5B%5D=c&d%5B0%5D%5Be%5D=f&d%5B0%5D%5Bg%5D=h&d%5B%5D=i&d%5B2%5D%5Bj%5D=k');