@@ -91,22 +91,32 @@ function createMatch(route, params) {
91
91
return { routes : [ route ] , params : params } ;
92
92
}
93
93
94
- function hasMatch ( routes , route , prevParams , nextParams ) {
94
+ function hasProperties ( object , properties ) {
95
+ for ( var propertyName in properties )
96
+ if ( properties . hasOwnProperty ( propertyName ) && object [ propertyName ] !== properties [ propertyName ] )
97
+ return false ;
98
+
99
+ return true ;
100
+ }
101
+
102
+ function hasMatch ( routes , route , prevParams , nextParams , prevQuery , nextQuery ) {
95
103
return routes . some ( function ( r ) {
96
104
if ( r !== route )
97
105
return false ;
98
106
99
107
var paramNames = route . paramNames ;
100
108
var paramName ;
101
109
110
+ // Ensure that all params the route cares about did not change.
102
111
for ( var i = 0 , len = paramNames . length ; i < len ; ++ i ) {
103
112
paramName = paramNames [ i ] ;
104
113
105
114
if ( nextParams [ paramName ] !== prevParams [ paramName ] )
106
115
return false ;
107
116
}
108
117
109
- return true ;
118
+ // Ensure the query hasn't changed.
119
+ return hasProperties ( prevQuery , nextQuery ) && hasProperties ( nextQuery , prevQuery ) ;
110
120
} ) ;
111
121
}
112
122
@@ -335,6 +345,7 @@ function createRouter(options) {
335
345
336
346
var prevRoutes = state . routes || [ ] ;
337
347
var prevParams = state . params || { } ;
348
+ var prevQuery = state . query || { } ;
338
349
339
350
var nextRoutes = match . routes || [ ] ;
340
351
var nextParams = match . params || { } ;
@@ -343,27 +354,17 @@ function createRouter(options) {
343
354
var fromRoutes , toRoutes ;
344
355
if ( prevRoutes . length ) {
345
356
fromRoutes = prevRoutes . filter ( function ( route ) {
346
- return ! hasMatch ( nextRoutes , route , prevParams , nextParams ) ;
357
+ return ! hasMatch ( nextRoutes , route , prevParams , nextParams , prevQuery , nextQuery ) ;
347
358
} ) ;
348
359
349
360
toRoutes = nextRoutes . filter ( function ( route ) {
350
- return ! hasMatch ( prevRoutes , route , prevParams , nextParams ) ;
361
+ return ! hasMatch ( prevRoutes , route , prevParams , nextParams , prevQuery , nextQuery ) ;
351
362
} ) ;
352
363
} else {
353
364
fromRoutes = [ ] ;
354
365
toRoutes = nextRoutes ;
355
366
}
356
367
357
- // If routes' hooks arrays are empty, then we transition to current route.
358
- // But path is somehow still get changed.
359
- // That could be only because of route query changes.
360
- // Need to push current route to routes' hooks arrays.
361
- if ( ! toRoutes . length && ! fromRoutes . length ) {
362
- var currentRoute = state . routes [ state . routes . length - 1 ] ;
363
- fromRoutes = [ currentRoute ] ;
364
- toRoutes = [ currentRoute ] ;
365
- }
366
-
367
368
var transition = new Transition ( path , this . replaceWith . bind ( this , path ) ) ;
368
369
pendingTransition = transition ;
369
370
0 commit comments