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'); }); });