diff options
Diffstat (limited to 'src/service/route.js')
| -rw-r--r-- | src/service/route.js | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/src/service/route.js b/src/service/route.js index 3d555e4d..2634eb6c 100644 --- a/src/service/route.js +++ b/src/service/route.js @@ -68,6 +68,8 @@ angularServiceInject('$route', function(location, $updateView) { matcher = switchRouteMatcher, parentScope = this, dirty = 0, + lastHashPath, + lastRouteParams, $route = { routes: routes, @@ -136,6 +138,18 @@ angularServiceInject('$route', function(location, $updateView) { * 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.myHashSearchParam; + * }, function(params) { + * //do stuff with params + * }); + * } + * * @returns {Object} route object * * @description @@ -144,8 +158,8 @@ angularServiceInject('$route', function(location, $updateView) { 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,6 +223,14 @@ angularServiceInject('$route', function(location, $updateView) { function updateRoute(){ var childScope, routeParams, pathParams, segmentMatch, key, redir; + if ($route.current) { + if (!$route.current.reloadOnSearch && (lastHashPath == location.hashPath)) { + $route.current.params = extend({}, location.hashSearch, lastRouteParams); + return; + } + } + + lastHashPath = location.hashPath; $route.current = null; forEach(routes, function(rParams, rPath) { if (!pathParams) { @@ -255,6 +277,7 @@ angularServiceInject('$route', function(location, $updateView) { scope: childScope, params: extend({}, location.hashSearch, pathParams) }); + lastRouteParams = pathParams; } //fire onChange callbacks @@ -266,7 +289,7 @@ angularServiceInject('$route', function(location, $updateView) { } - this.$watch(function(){return dirty + location.hash;}, updateRoute); + this.$watch(function(){ return dirty + location.hash; }, updateRoute); return $route; }, ['$location', '$updateView']); |
