Reputation: 394
I want to add new routes in that come back from my API.
But the routes are not getting registered on time. I am quite new with angular when I navigate to e.g./ http://localhost:4200/iphone-7 this will bring me to the 404 page but when i navigate to that route using <a [routerLink]="['iphone-7']">this</a>
then it works. How can I make sure my angular app registers the routes on time?
app-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule, Router } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { ReparationMainComponent } from './reparation-main/reparation-main.component';
import { BrandSelectionComponent } from './reparations/brand-selection/brand-selection.component';
import { ModelSelectionComponent } from './reparations/model-selection/model-selection.component';
import { RepairSelectionComponent } from './reparations/repair-selection/repair-selection.component';
import { PriceSelectionComponent } from './reparations/price-selection/price-selection.component';
import { ConfirmSelectionComponent } from './reparations/confirm-selection/confirm-selection.component';
import { NotFoundComponent } from './not-found/not-found.component';
import { RestfulService } from './helpers/restful/restful.service'
var routesMain: Routes = [
{ path: "", component: HomeComponent },
{ path: "reparatie", component: ReparationMainComponent },
{ path: "reparatie/:device/merk", component: BrandSelectionComponent },
{ path: "reparatie/:device/:brand/model", component: ModelSelectionComponent },
{ path: "reparatie/:device/:brand/:model/soort", component: RepairSelectionComponent },
{ path: "reparatie/:device/:brand/:model/:repair/pakket", component: PriceSelectionComponent },
{ path: "reparatie/:device/:brand/:model/:repair/:package/bevestig", component: ConfirmSelectionComponent },
{ path: '404', component: NotFoundComponent },
{ path: '**', redirectTo: '/404' }
];
@NgModule({
imports: [RouterModule.forRoot(routesMain)],
exports: [RouterModule]
})
export class AppRoutingModule {
constructor(
private restfullService: RestfulService,
private router: Router
) {
var routes: Routes = [];
restfullService.GetWithoutToken("pagina/all").subscribe((observer: Object[]) => {
observer.forEach(element => {
let title: string = element["titel"];
title = title.trim().replace(/ /g, "-").toLowerCase();
let newRoute = { path: title, component: HomeComponent };
routes.unshift(newRoute);
});
this.router.resetConfig([...routes, ...this.router.config]);
})
}
}
Restfull.service.ts => makes calls to my api
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class RestfulService {
constructor(private httpClient: HttpClient) { }
private API_URL: string = "http://localhost:5353/api/";
GetWithoutToken(endpoint) {
return this.httpClient.get(`${this.API_URL}${endpoint}`);
}
}
I don't have any further modification in my app, it has been standard generated with ng new
p.s.
This is inside the routes variable
Upvotes: 1
Views: 5179
Reputation: 1757
Try adding a one more route with same component.
Update route with guard
{ path: '', component: HomeComponent, pathMatch: 'full' },
{ path: ':id', component: HomeComponent, canActivate: [ProductsGuards] },
Add guard
@Injectable()
export class ProductsGuards implements CanActivate {
constructor(private restfulService: RestfulService) {}
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
return this.restfulService.findProduct(route.params.id).pipe(
map(isFound => {
if (isFound) {
return true;
} else {
// router.navigate('')
// Navigate to 404.
// Make sure that dont use /404 otherwise it will go in cycle
// or change product route to some other route.
// like http://localhost:4200/iphone-xs-max-reparatie
// to http://localhost:4200/products/iphone-xs-max-reparatie
}
})
);
}
}
update your service with following functions
findProduct(productFromUrl: string) {
return this.getProducts().pipe(
map((products: Product[]) => {
return products.filter(
product =>
product.seoTextTitel
.toLowerCase()
.split(' ')
.join('-') === productFromUrl
);
}),
take(1),
map(product => !!product)
);
}
getProducts() {
return this.httpClient.get('http://ros.azurewebsites.net/api/pagina/all');
}
Upvotes: 1