#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 }) ); }