Имя категории из пути с помощью canActivate. Отсутствующие категории из наблюдаемых

#angular #rxjs #routes #frontend

Вопрос:

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

Мое приложение-маршрутизация.модуль.ts:

 ....  }, {  path: ':mainCategory',  canActivate: [CategoriesGuard],  loadChildren: '../app/modules/categories/categories.module#CategoriesModule'  } ....  

Категории::

 import { Injectable } from "@angular/core"; import { ActivatedRouteSnapshot, CanActivate, Router } from "@angular/router"; import { CategoriesService } from "@app/shared/services/categories.service"; import { Observable } from "rxjs";  @Injectable() export class CategoriesGuard implements CanActivate {  constructor(private router: Router, public categoriesService: CategoriesService) { }   private categoryExists: boolean;   private categories$: Observablelt;anygt;;   public categories: any;    canActivate(route: ActivatedRouteSnapshot): boolean {  const categoryFromParam = route.paramMap.get('mainCategory');  this.getCategories();   // Here should check categories exists in database  const category = this.categories.filter(x =gt; x.categoryName = categoryFromParam);  if (category.lenght) {  return true  } else {  this.router.navigate(['404']);  return false  }  }   private getCategories(): void {  this.categories$ = this.categoriesService.getCategories();  this.categories$.subscribe(categories =gt; {  this.categories = categories;  })  };}  

метод categoriesService.GetCategories()

 public getCategories() {  return this.http.getlt;anygt;(this.categoriesEndpoint).pipe(  map(response =gt; { return response })  );  }  

Мои категории не определены, потому что метод canActivate не ожидает получения категорий из бэкенда. Как это должно выглядеть должным образом? Хорошая ли это идея сделать это таким образом?

Ответ №1:

canActivate может также возвращать наблюдаемое логическое значение, поэтому вместо подписки сделайте именно это:

 canActivate(route: ActivatedRouteSnapshot): Observablelt;booleangt; {  const categoryFromParam = route.paramMap.get('mainCategory');  return this.categoriesService.getCategories().pipe(  map((categories: any) =gt; {  const category = this.categories.filter(x =gt; x.categoryName = categoryFromParam);  if (category.length) {  return true  }  this.router.navigate(['404']);  return false  })  ); }