diff options
Diffstat (limited to 'src/service/route.js')
| -rw-r--r-- | src/service/route.js | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/src/service/route.js b/src/service/route.js index 972d616e..b7e4814b 100644 --- a/src/service/route.js +++ b/src/service/route.js @@ -68,6 +68,8 @@ angularServiceInject('$route', function($location) { matcher = switchRouteMatcher, parentScope = this, dirty = 0, + lastHashPath, + lastRouteParams, $route = { routes: routes, @@ -136,6 +138,18 @@ angularServiceInject('$route', function($location) { * The custom `redirectTo` function is expected to return a string which will be used * to update `$location.hash`. * + * - `[reloadOnSearch=true]` - {boolean=} - reload route when $location.hashSearch + * changes. If this option is disabled, you should set up a $watch to be notified of + * param (hashSearch) changes as follows: + * + * function MyCtrl($route) { + * this.$watch(function() { + * return $route.current.params; + * }, function(scope, params) { + * //do stuff with params + * }); + * } + * * @returns {Object} route object * * @description @@ -144,8 +158,8 @@ angularServiceInject('$route', function($location) { when:function (path, params) { if (isUndefined(path)) return routes; //TODO(im): remove - not needed! var route = routes[path]; - if (!route) route = routes[path] = {}; - if (params) extend(route, params); + if (!route) route = routes[path] = {reloadOnSearch: true}; + if (params) extend(route, params); //TODO(im): what the heck? merge two route definitions? dirty++; return route; }, @@ -209,9 +223,18 @@ angularServiceInject('$route', function($location) { function updateRoute(){ var selectedRoute, pathParams, segmentMatch, key, redir; - if ($route.current && $route.current.scope) { - $route.current.scope.$destroy(); + if ($route.current) { + if (!$route.current.reloadOnSearch && (lastHashPath == $location.hashPath)) { + $route.current.params = extend($location.hashSearch, lastRouteParams); + return; + } + + if ($route.current.scope) { + $route.current.scope.$destroy(); + } } + + lastHashPath = $location.hashPath; $route.current = null; // Match a route forEach(routes, function(rParams, rPath) { @@ -255,19 +278,20 @@ angularServiceInject('$route', function($location) { $route.current = extend({}, selectedRoute); $route.current.params = extend({}, $location.hashSearch, pathParams); + lastRouteParams = pathParams; } //fire onChange callbacks forEach(onChange, parentScope.$eval, parentScope); - // Create the scope if we have mtched a route + // Create the scope if we have matched a route if ($route.current) { $route.current.scope = parentScope.$new($route.current.controller); } } - this.$watch(function(){return dirty + $location.hash;}, updateRoute); + this.$watch(function(){ return dirty + $location.hash; }, updateRoute); return $route; }, ['$location']); |
