@@ -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 ( '/' ) ;
0 commit comments