mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-17 07:40:22 +00:00
feat($route): add caseInsensitiveMatch option for url matching
with this property urls can be matched case-insensitively which enables some new use cases.
This commit is contained in:
parent
60f1f099fc
commit
5e18a15fb0
2 changed files with 77 additions and 4 deletions
|
|
@ -92,13 +92,18 @@ function $RouteProvider(){
|
|||
* If the option is set to `false` and url in the browser changes, then
|
||||
* `$routeUpdate` event is broadcasted on the root scope.
|
||||
*
|
||||
* - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive
|
||||
*
|
||||
* If the option is set to `true`, then the particular route can be matched without being
|
||||
* case sensitive
|
||||
*
|
||||
* @returns {Object} self
|
||||
*
|
||||
* @description
|
||||
* Adds a new route definition to the `$route` service.
|
||||
*/
|
||||
this.when = function(path, route) {
|
||||
routes[path] = extend({reloadOnSearch: true}, route);
|
||||
routes[path] = extend({reloadOnSearch: true, caseInsensitiveMatch: false}, route);
|
||||
|
||||
// create redirection for trailing slashes
|
||||
if (path) {
|
||||
|
|
@ -343,14 +348,16 @@ function $RouteProvider(){
|
|||
/**
|
||||
* @param on {string} current url
|
||||
* @param when {string} route when template to match the url against
|
||||
* @param whenProperties {Object} properties to define when's matching behavior
|
||||
* @return {?Object}
|
||||
*/
|
||||
function switchRouteMatcher(on, when) {
|
||||
function switchRouteMatcher(on, when, whenProperties) {
|
||||
// TODO(i): this code is convoluted and inefficient, we should construct the route matching
|
||||
// regex only once and then reuse it
|
||||
|
||||
// Escape regexp special characters.
|
||||
when = '^' + when.replace(/[-\/\\^$:*+?.()|[\]{}]/g, "\\$&") + '$';
|
||||
|
||||
var regex = '',
|
||||
params = [],
|
||||
dst = {};
|
||||
|
|
@ -377,7 +384,7 @@ function $RouteProvider(){
|
|||
// Append trailing path part.
|
||||
regex += when.substr(lastMatchedIndex);
|
||||
|
||||
var match = on.match(new RegExp(regex));
|
||||
var match = on.match(new RegExp(regex, whenProperties.caseInsensitiveMatch ? 'i' : ''));
|
||||
if (match) {
|
||||
forEach(params, function(name, index) {
|
||||
dst[name] = match[index + 1];
|
||||
|
|
@ -466,7 +473,7 @@ function $RouteProvider(){
|
|||
// Match a route
|
||||
var params, match;
|
||||
forEach(routes, function(route, path) {
|
||||
if (!match && (params = switchRouteMatcher($location.path(), path))) {
|
||||
if (!match && (params = switchRouteMatcher($location.path(), path, route))) {
|
||||
match = inherit(route, {
|
||||
params: extend({}, $location.search(), params),
|
||||
pathParams: params});
|
||||
|
|
|
|||
|
|
@ -117,6 +117,72 @@ describe('$route', function() {
|
|||
});
|
||||
});
|
||||
|
||||
|
||||
it('should route and fire change event correctly whenever the case insensitive flag is utilized', function() {
|
||||
var log = '',
|
||||
lastRoute,
|
||||
nextRoute;
|
||||
|
||||
module(function($routeProvider) {
|
||||
$routeProvider.when('/Book1/:book/Chapter/:chapter/*highlight/edit',
|
||||
{controller: noop, templateUrl: 'Chapter.html', caseInsensitiveMatch: true});
|
||||
$routeProvider.when('/Book2/:book/*highlight/Chapter/:chapter',
|
||||
{controller: noop, templateUrl: 'Chapter.html'});
|
||||
$routeProvider.when('/Blank', {});
|
||||
});
|
||||
inject(function($route, $location, $rootScope) {
|
||||
$rootScope.$on('$routeChangeStart', function(event, next, current) {
|
||||
log += 'before();';
|
||||
expect(current).toBe($route.current);
|
||||
lastRoute = current;
|
||||
nextRoute = next;
|
||||
});
|
||||
$rootScope.$on('$routeChangeSuccess', function(event, current, last) {
|
||||
log += 'after();';
|
||||
expect(current).toBe($route.current);
|
||||
expect(lastRoute).toBe(last);
|
||||
expect(nextRoute).toBe(current);
|
||||
});
|
||||
|
||||
$location.path('/Book1/Moby/Chapter/Intro/one/edit').search('p=123');
|
||||
$rootScope.$digest();
|
||||
$httpBackend.flush();
|
||||
expect(log).toEqual('before();after();');
|
||||
expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one', p:'123'});
|
||||
|
||||
log = '';
|
||||
$location.path('/BOOK1/Moby/CHAPTER/Intro/one/EDIT').search('p=123');
|
||||
$rootScope.$digest();
|
||||
expect(log).toEqual('before();after();');
|
||||
expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one', p:'123'});
|
||||
|
||||
log = '';
|
||||
$location.path('/Blank').search('ignore');
|
||||
$rootScope.$digest();
|
||||
expect(log).toEqual('before();after();');
|
||||
expect($route.current.params).toEqual({ignore:true});
|
||||
|
||||
log = '';
|
||||
$location.path('/BLANK');
|
||||
$rootScope.$digest();
|
||||
expect(log).toEqual('before();after();');
|
||||
expect($route.current).toEqual(null);
|
||||
|
||||
log = '';
|
||||
$location.path('/Book2/Moby/one/two/Chapter/Intro').search('p=123');
|
||||
$rootScope.$digest();
|
||||
expect(log).toEqual('before();after();');
|
||||
expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', highlight:'one/two', p:'123'});
|
||||
|
||||
log = '';
|
||||
$location.path('/BOOK2/Moby/one/two/CHAPTER/Intro').search('p=123');
|
||||
$rootScope.$digest();
|
||||
expect(log).toEqual('before();after();');
|
||||
expect($route.current).toEqual(null);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it('should not change route when location is canceled', function() {
|
||||
module(function($routeProvider) {
|
||||
$routeProvider.when('/somePath', {template: 'some path'});
|
||||
|
|
|
|||
Loading…
Reference in a new issue