Reputation: 253
In my case I want to support same url in case insensitive manner.
Example: it should support all url
localhost:1029/documentation
localhost:1029/DOCUMENTATION
localhost:1029/DOCUMENTAtion
localhost:1029/docuMENTATION
Upvotes: 25
Views: 20240
Reputation: 1009
You should add this provide statement to the app.module.ts
import { DefaultUrlSerializer, UrlTree } from '@angular/router';
export class LowerCaseUrlSerializer extends DefaultUrlSerializer {
parse(url: string): UrlTree {
// Optional Step: Do some stuff with the url if needed.
// If you lower it in the optional step
// you don't need to use "toLowerCase"
// when you pass it down to the next function
return super.parse(url.toLowerCase());
}
}
And
@NgModule({
imports: [
...
],
declarations: [AppComponent],
providers: [
{
provide: UrlSerializer,
useClass: LowerCaseUrlSerializer
}
],
bootstrap: [AppComponent]
})
Upvotes: 34
Reputation: 790
import { DefaultUrlSerializer, UrlTree } from '@angular/router';
import { pascalize } from 'humps';
export class LowerCaseUrlSerializer extends DefaultUrlSerializer {
override parse(url: string): UrlTree {
var urlArray = url.split('/');
urlArray[urlArray.length - 1] = pascalize(urlArray[urlArray.length - 1]);
var newUrl = urlArray.join('/');
return super.parse(newUrl);
}
}
I did this because my routes are PascalCased. As long as you have predictable url where your route name is easily found, this strategy would work.
This will take
http://localhost:4200/#/someId/someRoute and make it http://localhost:4200/#/someId/SomeRoute
Upvotes: 0
Reputation: 933
Inspired by this thread, the following variant is supposed to lower-case only the UrlSegments in the URL part - and leave the query params alone.
The idea is to let DefaultUrlSerializer parse the URL to an UrlTree - and then go through the UrlTree and lowercase segments.
export class LowerCaseUrlSerializer extends DefaultUrlSerializer {
parse(url: string): UrlTree {
const urlTree = super.parse(url);
this.lowerCaseSegments(urlTree.root);
return urlTree;
}
private lowerCaseSegments(urlSegmentGroup: UrlSegmentGroup) {
if (urlSegmentGroup.hasChildren()) {
Object.entries(urlSegmentGroup.children).forEach(
([key, value]) => this.lowerCaseSegments(value)
);
}
urlSegmentGroup.segments.forEach((segment) => segment.path = segment.path.toLowerCase());
}
}
Upvotes: 3
Reputation: 312
This will work, configure the route to NotFoundComponent with wild character like below
{path:'**',component:NotFoundComponent}
then, in the NotFoundComponent.ts file, add the below lines inside ngOnInit()
if(this.route.snapshot.url[0].path.toLowerCase()!==this.route.snapshot.url[0].path)
this.router.navigate([this.route.snapshot.url[0].path.toLowerCase()]);
You have to import ActivatedRoute,Router from '@angular/router' and inject in constructor like below
constructor(private route:ActivatedRoute,
private router:Router) { }
Here if condition in ngOnInit() makes sure that it won't route or navigate infinitely
Upvotes: 1
Reputation: 786
You need a UrlSerializer as follow:
import { DefaultUrlSerializer, UrlTree } from '@angular/router';
export class LowerCaseUrlSerializer extends DefaultUrlSerializer {
parse(url: string): UrlTree {
return super.parse(url.toLowerCase());
}
}
And then added it as a provider in the app.module.ts
providers: [
{
provide: UrlSerializer,
useClass: LowerCaseUrlSerializer
}
]
Upvotes: 3