From a4ab88f8e610d757002cb970477aaee129598bfa Mon Sep 17 00:00:00 2001 From: Aleksei Androsov Date: Fri, 20 Nov 2015 13:35:00 +0300 Subject: [PATCH] =?UTF-8?q?=20[ns.router]=20=D0=A0=D0=BE=D1=83=D1=82=D0=B5?= =?UTF-8?q?=D1=80=20=D0=BD=D0=B5=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=B4=D0=B5=D1=84=D0=BE=D0=BB=D1=82=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D1=8B=20=D0=BF=D1=80=D0=B8=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20URL.=20Fix=20#582?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ns.router.js | 18 +++++++++++++++--- test/spec/ns.router.generateUrl.js | 7 ++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/ns.router.js b/src/ns.router.js index 6e98b45f..f9c4d325 100644 --- a/src/ns.router.js +++ b/src/ns.router.js @@ -273,7 +273,11 @@ ns.router._generateUrl = function(def, params) { var pvalue; var param; - for (var i = 0; i < def.sections.length; i++) { + // флаг, что у урле есть хотя бы один указанный (не дефолтный) параметр + var hasDefinedValue = false; + + // склеиваем урл с конца, чтобы убирать неуказанные дефолтные значения + for (var i = def.sections.length - 1; i >= 0; i--) { section = def.sections[i]; svalue = ''; @@ -283,10 +287,16 @@ ns.router._generateUrl = function(def, params) { if (!param.name) { // Добавляем статический кусок урла как есть. svalue += param.default_value; + hasDefinedValue = true; + } else { pvalue = params[param.name]; var is_param_present = param.name in params; + if (is_param_present) { + hasDefinedValue = true; + } + // Выставляем дефолтное значение только необязательным параметрам. if (param.is_optional && !is_param_present) { pvalue = param.default_value; @@ -303,7 +313,9 @@ ns.router._generateUrl = function(def, params) { } // Опциональный параметр не должен попасть в урл, если он не указан явно в params. - if (param.is_optional && !is_param_present) { + // Это происходит до тех пор, пока нет одного указанного параметра (hasDefinedValue === true) + // Опциональные части без дефолтного значения тоже пропускаем + if ((!hasDefinedValue || !pvalue) && param.is_optional && !is_param_present) { continue; } @@ -322,7 +334,7 @@ ns.router._generateUrl = function(def, params) { continue; } - result.push(svalue); + result.unshift(svalue); } url = result.join('/'); diff --git a/test/spec/ns.router.generateUrl.js b/test/spec/ns.router.generateUrl.js index 07af6fe6..714ebaf7 100644 --- a/test/spec/ns.router.generateUrl.js +++ b/test/spec/ns.router.generateUrl.js @@ -33,14 +33,14 @@ describe('generate url', function() { }); }); - describe('optional parameter', function() { + describe('optional parameter ->', function() { beforeEach(function() { ns.router.routes = { route: { '/folder/{name=inbox}': 'folder', '/{context=}/alert': 'alert-somewhere', - '/folder/{name=inbox}/file': 'folder-file' + '/folder/{name=inbox}/file/{id:int=1}': 'folder-file' } }; ns.router.init(); @@ -63,9 +63,10 @@ describe('generate url', function() { }); it('middle optional parameter', function() { - expect( ns.router.generateUrl('folder-file') ).to.be.equal('/folder/file'); + expect( ns.router.generateUrl('folder-file') ).to.be.equal('/folder/inbox/file'); expect( ns.router.generateUrl('folder-file', { name: 'inbox' }) ).to.be.equal('/folder/inbox/file'); expect( ns.router.generateUrl('folder-file', { name: 'favorites' }) ).to.be.equal('/folder/favorites/file'); + expect( ns.router.generateUrl('folder-file', { name: 'favorites', id: 2 }) ).to.be.equal('/folder/favorites/file/2'); }); });