Bowen
@Bowen
Японский бог

Позволяет ли Angular 2 выполнять валидацию параметров маршрута на уровне роутинга?

Добрый вечер.

Приведу пример реализации этого в Symfony:
@Route("/blog/{page}", name="blog_list", requirements={"page": "\d+"})

Я ничего похожего не смог найти. Возможно я что то проглядел а может angular2 пока что это не умеет.

Буду признателен за помощь.
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 1
Bowen
@Bowen Автор вопроса
Японский бог
Решил таким образом:
  1. Создал сервис в котором у меня осуществляется проверка параметров маршрутов.
  2. Импортировал этот сервис в главном модуле app.module
  3. Прописал его в providers
router-params.guard.ts
import { 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.ts
import 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']
}];

Реализовать наверное можно было и по другому, но я так и не понял как это можно было сделать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы