В этой статье мы собираемся понимать правильный путь …
- Как можно использовать угловой роутер?
- Как защитить угловой роутер?
- Как установить название динамического документа при изменении страницы маршрута?
- Как сделать компонент хлебовщиков?
В этом проекте мы используем Bootstrap и здесь я не устанавливаю содержимое загрузочного содержимого, я предполагаю, что вы предварительно настроили компонент Bootstrap в угловом проекте.
Прежде всего создать новый угловой проект с вариантом маршрутизации.
ng new dynamictitle
открыть Приложение. Module.ts
Файл и добавляет путь маршрутизации.
const routes: Routes = [ { path: "", component: MainComponent, data: { title: "Root Page", breadcrums: "Root" } }, { path: "login", component: LoginComponent, data: { title: "Login Page", breadcrums: "Login" } }, { path: "home", component: HomeComponent, data: { title: "Home Page", breadcrums: "Home" }, children: [ { path: "records", component: RecordsComponent, data: { title: "Home / Records Page", breadcrums: "Records" }, children: [ { path: "findrecords", component: HelloComponent, data: { title: "Find Records Page", breadcrums: "Find-Records" } } ] } ], canActivate: [ProtectRouteGuard] }, { path: "about", component: AboutComponent, data: { title: "About Page", breadcrums: "About" }, canActivate: [ProtectRouteGuard] } ];
Теперь мы добавляем некоторые новые свойства выше файла маршрутизатора.
Данные: {Название: ”, Брезентация: ”}, объект данных имеет два свойства, позже в компонентном дереве нам нужна эта информация, когда этот маршрут изменен. Название отображается над заголовком документа, а панорумы отображаются внутри корневой страницы.
CANACTIVATE: [] Canactivate Router Guard защищает наш путь, и мы не можем направляться на эту страницу без входа в сайт или любое ограничение, которое мы навязываем на основе роли пользователя.
Дети: [], это используется для установки внутреннего пути страницы. Таким образом, это внутренние маршруты или можем сказать, что эти маршруты являются детьми родственных родителей. Как
Home => записи => Найти-записи
Отказ
Согласно конфигурации пути маршрута, создайте связанный компонент, используя ..
ng generate component Main
В приведенной выше команде просто измените другие компоненты, такие как .. Дом, о, крошкоры, заголовок, логин.
Теперь генерируют дочерний компонент HomeComponent ..
ng g c home/records
И внутренние записи компонента генерируют поиск компонента записей ..
ng g c home/records/hello
Теперь мы защищаем наш путь ..
Для этого генерируют новую службу и охрану внутри папки аутентификации, если не создайте новую папку аутентификации корневого уровня. Внутри этой папки генерируют сервис и охрану.
ng g s authentication ng g guard protect-guard
Открытая служба аутентификации …
export class AuthenticationService { private isLoggedIn: BehaviorSubject= new BehaviorSubject ( false ); private isLoggedIn$ = this.isLoggedIn.asObservable(); constructor(private router: Router) {} getIsUserLoggedIn(): Observable { return this.isLoggedIn$; } setUserLoggedIn(loggedInStatus: boolean) { this.isLoggedIn.next(loggedInStatus); loggedInStatus ? this.router.navigate(["home"]) : this.router.navigate(["login"]); } }
и внутри авторки ..
export class ProtectRouteGuard implements CanActivate { constructor( private authService: AuthenticationService, private router: Router ) {} canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot ): Observable| Promise | boolean { return this.authService.getIsUserLoggedIn().pipe( take(1), map((isLoggedIn: boolean) => { if (!isLoggedIn) { this.router.navigate(["login"]); return false; } return true; }) ); } }
Теперь мы предоставляем защищенные службы охраны внутри приложения. Module.ts
providers: [ProtectRouteGuard]
А внутри приложение-маршрута. Module.ts Файл, мы защищаем маршрут с использованием канактивата: [ProtectRouteguard]
До настоящего времени мы закончили защиту наших маршрутов, теперь мы переходим к серии второй части.
Часть 2 [Настройка динамического пути заголовка и панорумы]
Во-первых, генерировать новый главный сервис ..
ng g s main
потом , внутри основного обслуживания …
export class MainService { routerEventsTitle$: Observable; breadCrumbs: IBreadCrums[] = [{ label: "", url: "" }]; constructor( private title: GetSetPageTitleService, private router: Router, private activatedRouter: ActivatedRoute ) { this.routerEventsTitle$ = this.getSetRouterTitle(); } setDefaultTitle(defaultTitle: string) { this.title.setCurrentTitle(defaultTitle); } getSetRouterTitle(): Observable { return this.router.events.pipe( filter((event: RouterEvent) => event instanceof NavigationEnd), map((routeUrl: RouterEvent) => { let childRouter = this.activatedRouter.firstChild; while (childRouter.firstChild) { childRouter = childRouter.firstChild; } if (childRouter.snapshot.data["title"]) { let titleBreadCrums: IUrlTitle = { url: routeUrl.url, title: childRouter.snapshot.data["title"] }; return titleBreadCrums; } return { url: routeUrl.url, title: this.title.getCurrentTitle() }; }), map((titleUrl: IUrlTitle) => { this.breadCrumbs.length = 0; let menuItem = this.generateBreadCrums(this.activatedRouter.root); this.breadCrumbs.push(...menuItem); return { ...titleUrl, breadCrums: this.breadCrumbs }; }), tap((currentTitle: IUrlTitle) => { // /this.breadCrumbs.push(currentTitle); this.title.setCurrentTitle(currentTitle.title); console.log("b ", this.breadCrumbs); }) ); } generateBreadCrums( activatedRouter: ActivatedRoute, url = "", breadcrumbs: IBreadCrums[] = [{ label: "", url: "" }] ): IBreadCrums[] { const children: ActivatedRoute[] = activatedRouter.children; if (children.length === 0) { return breadcrumbs; } for (const child of children) { const routeURL: string = child.snapshot.url .map(segment => segment.path) .join("/"); if (routeURL !== "") { url += `/${routeURL}`; } console.log("url ", routeURL); const label = child.snapshot.data["breadcrums"]; console.log("label ", label); if (label) { breadcrumbs.push({ label, url }); } return this.generateBreadCrums(child, url, breadcrumbs); } } }
В настоящее время, Откройте app.component.html Файл
В настоящее время, Откройте app.component.ts Файл
export class AppComponent { name = "Angular " + VERSION.major; appRootTitle = "Root Page"; routerEventsTitle$: Observable; constructor(private mainService: MainService) { this.mainService.setDefaultTitle(this.appRootTitle); } ngOnInit() { this.routerEventsTitle$ = this.mainService.routerEventsTitle$; } }
Прежде всего, мы вводим основной сервис внутри app.component.ts, то мы получаем наблюдаемые и подписывающиеся внутри компонента с помощью асинхронизации. Затем внутренний файл шаблона мы проходим ввод в компонент в количестве сусальных курман.
Сейчас генерируйте файл chadcroumbs.template
Теперь генерируйте файл хлебовщиков.
export class BreadcrumsComponent implements OnInit { items; @Input("modelItems") set menu(item) { this.items = item; } constructor() {} ngOnInit() {} }
Полный рабочий пример здесь
Оригинал: “https://dev.to/gaurangdhorda/angular-router-set-dynamically-document-title-of-page-protect-router-with-guard-and-breadcrumbs-component-1784”