Angular — динамическая маршрутизация с параметром маршрутизатора, доступная

#javascript #angular #typescript #routes #angular-router-guards

#javascript #угловатый #typescript #маршруты #угловые-фрезы-ограждения

Вопрос:

Я хочу сделать что-то подобное в моем routing.module.ts (см. Строки, отмеченные —>)

 export const routes: Routes = [
        path: 'test/:action',
        component: CreateComponent,
        --> canActivate: ':action' == 'read' ? [Guard1] : [Guard1, Guard2],
        data: {
        -->  screenAction: ':action' == 'read' ? 'read' : ':action',
        }
]
 

Я должен использовать переменную :action, потому что она используется позже в параметре маршрутизатора. Спасибо за вашу помощь!

Ответ №1:

Ну, то, что вы просите, возможно, но реализация этого может быть немного сложной.

Прежде всего, вам нужно определить несколько маршрутов вместо 1. Где вы можете применить требуемые условия.

 const routes: Routes = [
  { path: '', redirectTo: '/home', pathMatch: 'full' },
  { path: 'home', component: AppComponent },
  {
    path: 'dummy1/:action',
    component: Dummy1Component,
    canActivate: [GuardRotaterGuard],
  },
  {
    path: 'dummyx/:action',
    component: Dummy2Component,
    canActivate: [Guard1Guard],
  },
  {
    path: 'dummyz/:action',
    canActivate: [Guard1Guard, Guard2Guard],
    component: Dummy2Component,
  },
];
 

Маршрут dummy1/:action похож на маршрут шлюза. Каждый запрос к компоненту dummy2 должен идти отсюда. И тогда вам понадобится решающий / поворотный механизм, который может определять и поворачивать маршрут в зависимости от параметров маршрута.
Это должно выглядеть следующим образом :

 canActivate(
    next: ActivatedRouteSnapshot,
    statex: RouterStateSnapshot
  ): Observable<boolean> | Promise<boolean> | boolean {
    const { action } = next.params;
    const state = { comesFrom: 'rotater' };
    console.log("rotater",action);
    if (action === 'read') { // you can decide whatever you want here
       this.router.navigate(['/dummyx/read'], { state });
    }else{
      this.router.navigate(['/dummyz', action], { state }); // pass the action to the other route as a parameter
    }

     return true;
  }
 

А вот пример Stackblitz в действии.

Комментарии:

1. @elder Спасибо за ваш ответ. Что касается screenAction, соответствует ли оно состоянию, которое вы передаете в методе router.navigation() ?

2. @BenSaad маршрут dummy1 никогда не маршрутизируется, поэтому вы не видите компонент dummy1. Существовала давняя проблема с использованием охранников на маршруте без компонента, поэтому я предпочел этот способ.

3. @BenSaad в конфигурационных данных маршрутизатора используется для статических данных, которые вы не можете использовать динамически. Так что, если вы хотите передать динамическое состояние данных или параметры маршрута, вот способы, которыми можно воспользоваться. Если вы предоставите некоторую информацию о том, где и как вы собираетесь использовать screenAction , мы могли бы решить, что вам нужно использовать.

4. Еще раз спасибо @Eldar! Но есть проблема. Если он прочитал ваше перенаправление на dummyx/:action, в противном случае вы перенаправляете на dummyz/:action. Таким образом, путь в URL отличается, если это чтение или другое действие. Я хочу, чтобы начало пути было одинаковым для всех действий. (например, dummyX / чтение и dummyX / запись).

5. @BenSaad в конфигурации маршрута angular является статическим. Таким образом, вы не можете изменять правила во время выполнения по умолчанию. Если вы хотите такого поведения, вам нужно написать защиту, которая выглядит как защита ротатора здесь, и она должна выполнять проверки, которые guard1 и guard2 выполняют вручную в зависимости от условия. Существует еще одна возможность , которая заключается в использовании библиотеки под названием aop-routing . Он предоставляет возможности для динамического управления маршрутами. Статья