Как установить свойства компонента для разных маршрутов?

#angular

#angular

Вопрос:

В моем приложении Angular у меня есть компонент верхней навигации, в трех маршрутах я должен показывать корзину в этом компоненте, до сих пор я использовал сервис с BehaviourSubject, и когда я перемещался, как в маршруте продуктов, я устанавливал для него значение true, а затем в моей верхней навигации я проверялчто, если это правда, я должен был показать корзину.

Но теперь мне нужно найти другой подход, что-то внутри компонента top-nav, который определяет, нахожусь ли я в маршруте «продукты», чтобы показать корзину, иначе, если я нахожусь в маршруте «магазин», чтобы скрыть его, поскольку я использую маршрут повторного использования, и я не могу установить BehaviourSubject для навигации обратно в «продукты»

Какой был бы лучшим способом сделать следующее?

в конструкторе top-nav у меня есть следующее:

 cartService.isCartEnabled.subscribe((data) => (this.cart = data));
  

а затем в html я проверяю cart , показываю ли true я значок корзины.

Ответ №1:

Вы можете добавить атрибуты к своему маршруту, а затем охрану маршрута, чтобы установить атрибут для навигации.

Вот ссылка на angular docs о настройке атрибутов маршрута

Вы добавляете узел данных с некоторыми атрибутами к маршруту, на котором хотите отобразить корзину:

 ...
  {
    path: 'with-cart',
    component: YourComponent,
    data: { displayCar: true }
  },
  {
    path: 'without-cart',
    component: YourComponent,
  },
...
  

используя распознаватель (подробнее в angular docs), вы можете прочитать этот параметр данных и установить его в службе:

 @Injectable({
  providedIn: 'root',
})
export class CartResolverService implements Resolve<boolean> {
  constructor(private yourService: YourService) {}

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    this.yourService.setDisplayCart(route.data.displayCart)
    
    return of(route.data.displayCart === true);
  }
}

  

и снова перенастроите маршруты с помощью этого преобразователя:

   {
    path: 'with-cart',
    component: YourComponent,
    data: { displayCar: true },
    resolve: {
      cartResolver: CartResolverService,
    },
  },
  {
    path: 'without-cart',
    component: YourComponent,
    resolve: {
      cartResolver: CartResolverService,
    },
  },

  

И ваш nav должен быть подписан на эту службу, чтобы он мог вносить изменения.

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

1. Это потрясающее решение, но поскольку top-nav используется на каждом маршруте, мне нужно будет добавить Resolver к каждому маршруту, будет ли хорошим решением даже проверить URL-адрес маршрута в NavigationEnd top-nav и если путь url отличается от того, в котором корзина должна быть включена только для того, чтобыустановите для него значение отключено?

2. вы всегда можете сделать обратное, переменную, которая скрывала бы корзину (вместо того, чтобы показывать ее) и добавляла распознаватель там, где вы хотите его скрыть

3. затем вы можете подписаться на изменения маршрута из вашего основного компонента и установить корзину видимой на событии navigationStart ( angular.io/api/router/NavigationStart )

4. на самом деле, как и в любом другом маршруте, я еще не установил значение isCartEnabled в false, мне нужно было просто добавить распознаватель в path, где мне это было нужно, спасибо!