Unified
Split
Showing
with
29 additions
and 8 deletions.
- +6 −2 src/Angular.js
- +10 −4 src/ng/filter/filters.js
- +10 −2 test/AngularSpec.js
- +3 −0 test/ng/filter/filtersSpec.js
| @@ -964,12 +964,16 @@ function toJsonReplacer(key, value) { | ||
| * stripped since angular uses this notation internally. | ||
| * | ||
| * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. | ||
| * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace. | ||
| * @param {boolean|number=} pretty If set to true, the JSON output will contain newlines and whitespace. | ||
| * If set to an integer, the JSON output will contain that many spaces per indentation (the default is 2). | ||
| * @returns {string|undefined} JSON-ified string representing `obj`. | ||
| */ | ||
| function toJson(obj, pretty) { | ||
| if (typeof obj === 'undefined') return undefined; | ||
| return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null); | ||
| if (!isNumber(pretty)) { | ||
| pretty = pretty ? 2 : null; | ||
| } | ||
| return JSON.stringify(obj, toJsonReplacer, pretty); | ||
| } | ||
|
|
||
|
|
||
| @@ -501,25 +501,31 @@ function dateFilter($locale) { | ||
| * the binding is automatically converted to JSON. | ||
| * | ||
| * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. | ||
| * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. | ||
| * @returns {string} JSON string. | ||
| * | ||
| * | ||
| * @example | ||
| <example> | ||
| <file name="index.html"> | ||
| <pre>{{ {'name':'value'} | json }}</pre> | ||
| <pre id="default-spacing">{{ {'name':'value'} | json }}</pre> | ||
| <pre id="custom-spacing">{{ {'name':'value'} | json:4 }}</pre> | ||
| </file> | ||
| <file name="protractor.js" type="protractor"> | ||
| it('should jsonify filtered objects', function() { | ||
| expect(element(by.binding("{'name':'value'}")).getText()).toMatch(/\{\n "name": ?"value"\n}/); | ||
| expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); | ||
| expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); | ||
| }); | ||
| </file> | ||
| </example> | ||
| * | ||
| */ | ||
| function jsonFilter() { | ||
| return function(object) { | ||
| return toJson(object, true); | ||
| return function(object, spacing) { | ||
| if (isUndefined(spacing)) { | ||
| spacing = 2; | ||
| } | ||
| return toJson(object, spacing); | ||
| }; | ||
| } | ||
|
|
||
| @@ -1191,9 +1191,17 @@ describe('angular', function() { | ||
|
|
||
| it('should format objects pretty', function() { | ||
| expect(toJson({a: 1, b: 2}, true)). | ||
| toBeOneOf('{\n "a": 1,\n "b": 2\n}', '{\n "a":1,\n "b":2\n}'); | ||
| toBe('{\n "a": 1,\n "b": 2\n}'); | ||
| expect(toJson({a: {b: 2}}, true)). | ||
| toBeOneOf('{\n "a": {\n "b": 2\n }\n}', '{\n "a":{\n "b":2\n }\n}'); | ||
| toBe('{\n "a": {\n "b": 2\n }\n}'); | ||
| expect(toJson({a: 1, b: 2}, false)). | ||
| toBe('{"a":1,"b":2}'); | ||
| expect(toJson({a: 1, b: 2}, 0)). | ||
| toBe('{"a":1,"b":2}'); | ||
| expect(toJson({a: 1, b: 2}, 1)). | ||
| toBe('{\n "a": 1,\n "b": 2\n}'); | ||
| expect(toJson({a: 1, b: 2}, {})). | ||
| toBe('{\n "a": 1,\n "b": 2\n}'); | ||
| }); | ||
|
|
||
|
|
||
| @@ -210,6 +210,9 @@ describe('filters', function() { | ||
| it('should do basic filter', function() { | ||
| expect(filter('json')({a:"b"})).toEqual(toJson({a:"b"}, true)); | ||
| }); | ||
| it('should allow custom indentation', function() { | ||
| expect(filter('json')({a:"b"}, 4)).toEqual(toJson({a:"b"}, 4)); | ||
| }); | ||
| }); | ||
|
|
||
| describe('lowercase', function() { | ||