Решил таким образом:
- Создал сервис в котором у меня осуществляется проверка параметров маршрутов.
- Импортировал этот сервис в главном модуле app.module
- Прописал его в providers
router-params.guard.tsimport { Injectable } from '@angular/core';
import { CanActivate , ActivatedRouteSnapshot } from '@angular/router';
import { map, every } from 'lodash';
/**
* Список параметров
* Сам список можете вынести в отдельном файле(я же для теста указал тут)
* @type {Object}
*/
const gp = {
action: 'add|edit',
id: '[0-9]'
};
@Injectable()
export class RouterGuard implements CanActivate {
canActivate(route: ActivatedRouteSnapshot) {
let access: Array<boolean> = [];
map(route.params, (v: any, k: any) => access.push(new RegExp(gp[k], 'g').test(v)));
return every(access, Boolean);
}
};
app.module.tsimport RouterParamsGuard from './router-params.guard';
@NgModule({
imports: [
BrowserModule,
HttpModule,
AppRoutingModule
],
declarations: [
AppComponent,
HomeComponent,
NotFoundComponent
],
providers: [{
provide: APP_BASE_HREF,
useValue: '/'
}, {
provide: LocationStrategy,
useClass: PathLocationStrategy
},
{
provide: 'RouterParamsGuard',
useClass: RouterParamsGuard
},
AppStore
],
bootstrap: [
AppComponent
]
})
Теперь в файлах где у меня были прописаны маршруты, к нужному маршруту добавил:
canActivate: ['RouterParamsGuard']
Выглядит это так
export const routes: Routes = [{
path: 'post/:id',
loadChildren: './post?chunkName=post',
canActivate: ['RouterParamsGuard']
}];
Реализовать наверное можно было и по другому, но я так и не понял как это можно было сделать.