Skip to content

Commit a4ab88f

Browse files
committed
[ns.router] Роутер не добавляет дефолтные параметры при генерации URL. Fix #582
1 parent 088782c commit a4ab88f

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

src/ns.router.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,11 @@ ns.router._generateUrl = function(def, params) {
273273
var pvalue;
274274
var param;
275275

276-
for (var i = 0; i < def.sections.length; i++) {
276+
// флаг, что у урле есть хотя бы один указанный (не дефолтный) параметр
277+
var hasDefinedValue = false;
278+
279+
// склеиваем урл с конца, чтобы убирать неуказанные дефолтные значения
280+
for (var i = def.sections.length - 1; i >= 0; i--) {
277281
section = def.sections[i];
278282
svalue = '';
279283

@@ -283,10 +287,16 @@ ns.router._generateUrl = function(def, params) {
283287
if (!param.name) {
284288
// Добавляем статический кусок урла как есть.
285289
svalue += param.default_value;
290+
hasDefinedValue = true;
291+
286292
} else {
287293
pvalue = params[param.name];
288294
var is_param_present = param.name in params;
289295

296+
if (is_param_present) {
297+
hasDefinedValue = true;
298+
}
299+
290300
// Выставляем дефолтное значение только необязательным параметрам.
291301
if (param.is_optional && !is_param_present) {
292302
pvalue = param.default_value;
@@ -303,7 +313,9 @@ ns.router._generateUrl = function(def, params) {
303313
}
304314

305315
// Опциональный параметр не должен попасть в урл, если он не указан явно в params.
306-
if (param.is_optional && !is_param_present) {
316+
// Это происходит до тех пор, пока нет одного указанного параметра (hasDefinedValue === true)
317+
// Опциональные части без дефолтного значения тоже пропускаем
318+
if ((!hasDefinedValue || !pvalue) && param.is_optional && !is_param_present) {
307319
continue;
308320
}
309321

@@ -322,7 +334,7 @@ ns.router._generateUrl = function(def, params) {
322334
continue;
323335
}
324336

325-
result.push(svalue);
337+
result.unshift(svalue);
326338
}
327339

328340
url = result.join('/');

test/spec/ns.router.generateUrl.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ describe('generate url', function() {
3333
});
3434
});
3535

36-
describe('optional parameter', function() {
36+
describe('optional parameter ->', function() {
3737

3838
beforeEach(function() {
3939
ns.router.routes = {
4040
route: {
4141
'/folder/{name=inbox}': 'folder',
4242
'/{context=}/alert': 'alert-somewhere',
43-
'/folder/{name=inbox}/file': 'folder-file'
43+
'/folder/{name=inbox}/file/{id:int=1}': 'folder-file'
4444
}
4545
};
4646
ns.router.init();
@@ -63,9 +63,10 @@ describe('generate url', function() {
6363
});
6464

6565
it('middle optional parameter', function() {
66-
expect( ns.router.generateUrl('folder-file') ).to.be.equal('/folder/file');
66+
expect( ns.router.generateUrl('folder-file') ).to.be.equal('/folder/inbox/file');
6767
expect( ns.router.generateUrl('folder-file', { name: 'inbox' }) ).to.be.equal('/folder/inbox/file');
6868
expect( ns.router.generateUrl('folder-file', { name: 'favorites' }) ).to.be.equal('/folder/favorites/file');
69+
expect( ns.router.generateUrl('folder-file', { name: 'favorites', id: 2 }) ).to.be.equal('/folder/favorites/file/2');
6970
});
7071
});
7172

0 commit comments

Comments
 (0)