From 0d1aef2adf7ac52c7e0540118b06820ebce82162 Mon Sep 17 00:00:00 2001 From: Ray Tiley Date: Thu, 20 Mar 2014 19:45:53 -0500 Subject: [PATCH 1/2] [query-params-new] Issue - #4570 don't serialize null or undefined into url # Conflicts: # packages/ember/tests/routing/query_params_test.js # packages_es6/ember-routing/lib/system/route.js --- packages/ember-routing/lib/system/router.js | 4 +- .../ember/tests/routing/query_params_test.js | 57 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index d29865fc461..110841cd255 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -701,7 +701,9 @@ const EmberRouter = EmberObject.extend(Evented, { @param {String} type */ _serializeQueryParam(value, type) { - if (type === 'array') { + if (value === null || value === undefined) { + return null; + } else if (type === 'array') { return JSON.stringify(value); } diff --git a/packages/ember/tests/routing/query_params_test.js b/packages/ember/tests/routing/query_params_test.js index 279b23dd20c..81ca73dfc1e 100644 --- a/packages/ember/tests/routing/query_params_test.js +++ b/packages/ember/tests/routing/query_params_test.js @@ -1153,6 +1153,63 @@ moduleFor('Query Params - main', class extends QueryParamTestCase { }); } + test("Setting bound query pram property to null or undefined do not seralize to url", function() { + Router.map(function() { + this.route("home", { path: '/home' }); + }); + + App.HomeController = Ember.Controller.extend({ + queryParams: ['foo'], + foo: [1, 2] + }); + + startingURL = '/home'; + bootApplication(); + + var controller = container.lookup('controller:home'); + + deepEqual(controller.get('foo'), [1,2]); + equal(router.get('location.path'), "/home"); + + Ember.run(controller, 'set', 'foo', [1,3]); + equal(router.get('location.path'), "/home?foo=%5B1%2C3%5D"); + + Ember.run(router, 'transitionTo', '/home'); + deepEqual(controller.get('foo'), [1,2]); + + Ember.run(controller, 'set', 'foo', null); + equal(router.get('location.path'), "/home", "Setting property to null"); + + Ember.run(controller, 'set', 'foo', [1,3]); + equal(router.get('location.path'), "/home?foo=%5B1%2C3%5D"); + + Ember.run(controller, 'set', 'foo', undefined); + equal(router.get('location.path'), "/home", "Setting property to undefined"); + }); + + test("{{link-to}} with null or undefined qps do not get serialized into url", function() { + Ember.TEMPLATES.home = Ember.Handlebars.compile( + "{{link-to 'Home' 'home' (query-params foo=nullValue) id='null-link'}}" + + "{{link-to 'Home' 'home' (query-params foo=undefinedValue) id='undefined-link'}}"); + Router.map(function() { + this.route("home", { path: '/home' }); + }); + + App.HomeController = Ember.Controller.extend({ + queryParams: ['foo'], + foo: [], + nullValue: null, + undefinedValue: undefined + }); + + startingURL = '/home'; + bootApplication(); + + var controller = container.lookup('controller:home'); + equal(Ember.$('#null-link').attr('href'), "/home"); + equal(Ember.$('#undefined-link').attr('href'), "/home"); + }); + ['@test A child of a resource route still defaults to parent route\'s model even if the child route has a query param'](assert) { assert.expect(2); From 7cbf4b2325201cfaa22c07c0d0cbc5b66c6699b0 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Wed, 30 Aug 2017 16:18:05 +0200 Subject: [PATCH 2/2] Bring query params fix up to date. --- packages/ember-routing/lib/system/route.js | 5 +- packages/ember-routing/lib/system/router.js | 6 +- .../ember/tests/routing/query_params_test.js | 75 +++++++++---------- 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/packages/ember-routing/lib/system/route.js b/packages/ember-routing/lib/system/route.js index d819d91d7fe..a8f374a7738 100644 --- a/packages/ember-routing/lib/system/route.js +++ b/packages/ember-routing/lib/system/route.js @@ -848,7 +848,10 @@ let Route = EmberObject.extend(ActionHandler, Evented, { } else { if (presentKey) { svalue = params[presentKey]; - value = route.deserializeQueryParam(svalue, qp.urlKey, qp.type); + + if (svalue !== undefined) { + value = route.deserializeQueryParam(svalue, qp.urlKey, qp.type); + } } else { // No QP provided; use default value. svalue = qp.serializedDefaultValue; diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index 110841cd255..956e2a289a2 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -702,7 +702,7 @@ const EmberRouter = EmberObject.extend(Evented, { */ _serializeQueryParam(value, type) { if (value === null || value === undefined) { - return null; + return value; } else if (type === 'array') { return JSON.stringify(value); } @@ -739,7 +739,9 @@ const EmberRouter = EmberObject.extend(Evented, { @param {String} defaultType */ _deserializeQueryParam(value, defaultType) { - if (defaultType === 'boolean') { + if (value === null || value === undefined) { + return value; + } else if (defaultType === 'boolean') { return value === 'true'; } else if (defaultType === 'number') { return (Number(value)).valueOf(); diff --git a/packages/ember/tests/routing/query_params_test.js b/packages/ember/tests/routing/query_params_test.js index 81ca73dfc1e..5640658542b 100644 --- a/packages/ember/tests/routing/query_params_test.js +++ b/packages/ember/tests/routing/query_params_test.js @@ -1153,62 +1153,59 @@ moduleFor('Query Params - main', class extends QueryParamTestCase { }); } - test("Setting bound query pram property to null or undefined do not seralize to url", function() { - Router.map(function() { - this.route("home", { path: '/home' }); - }); + ['@test Setting bound query param property to null or undefined does not serialize to url'](assert) { + assert.expect(9); - App.HomeController = Ember.Controller.extend({ - queryParams: ['foo'], - foo: [1, 2] + this.router.map(function() { + this.route('home'); }); - startingURL = '/home'; - bootApplication(); + this.setSingleQPController('home', 'foo', [1, 2]); - var controller = container.lookup('controller:home'); + return this.visitAndAssert('/home').then(() => { + var controller = this.getController('home'); - deepEqual(controller.get('foo'), [1,2]); - equal(router.get('location.path'), "/home"); + assert.deepEqual(controller.get('foo'), [1,2]); + this.assertCurrentPath('/home'); - Ember.run(controller, 'set', 'foo', [1,3]); - equal(router.get('location.path'), "/home?foo=%5B1%2C3%5D"); + this.setAndFlush(controller, 'foo', emberA([1,3])); + this.assertCurrentPath('/home?foo=%5B1%2C3%5D'); - Ember.run(router, 'transitionTo', '/home'); - deepEqual(controller.get('foo'), [1,2]); + return this.transitionTo('/home').then(() => { + assert.deepEqual(controller.get('foo'), [1,2]); + this.assertCurrentPath('/home'); - Ember.run(controller, 'set', 'foo', null); - equal(router.get('location.path'), "/home", "Setting property to null"); + this.setAndFlush(controller, 'foo', null); + this.assertCurrentPath('/home', 'Setting property to null'); - Ember.run(controller, 'set', 'foo', [1,3]); - equal(router.get('location.path'), "/home?foo=%5B1%2C3%5D"); + this.setAndFlush(controller, 'foo', emberA([1,3])); + this.assertCurrentPath('/home?foo=%5B1%2C3%5D'); - Ember.run(controller, 'set', 'foo', undefined); - equal(router.get('location.path'), "/home", "Setting property to undefined"); - }); + this.setAndFlush(controller, 'foo', undefined); + this.assertCurrentPath('/home', 'Setting property to undefined'); + }); + }); + } - test("{{link-to}} with null or undefined qps do not get serialized into url", function() { - Ember.TEMPLATES.home = Ember.Handlebars.compile( - "{{link-to 'Home' 'home' (query-params foo=nullValue) id='null-link'}}" + - "{{link-to 'Home' 'home' (query-params foo=undefinedValue) id='undefined-link'}}"); - Router.map(function() { - this.route("home", { path: '/home' }); + ['@test {{link-to}} with null or undefined QPs does not get serialized into url'](assert) { + assert.expect(3); + + this.addTemplate('home', '{{link-to \'Home\' \'home\' (query-params foo=nullValue) id=\'null-link\'}}{{link-to \'Home\' \'home\' (query-params foo=undefinedValue) id=\'undefined-link\'}}'); + + this.router.map(function() { + this.route('home'); }); - App.HomeController = Ember.Controller.extend({ - queryParams: ['foo'], - foo: [], + this.setSingleQPController('home', 'foo', [], { nullValue: null, undefinedValue: undefined }); - startingURL = '/home'; - bootApplication(); - - var controller = container.lookup('controller:home'); - equal(Ember.$('#null-link').attr('href'), "/home"); - equal(Ember.$('#undefined-link').attr('href'), "/home"); - }); + return this.visitAndAssert('/home').then(() => { + assert.equal(this.$('#null-link').attr('href'), '/home'); + assert.equal(this.$('#undefined-link').attr('href'), '/home'); + }); + } ['@test A child of a resource route still defaults to parent route\'s model even if the child route has a query param'](assert) { assert.expect(2);