В этой статье мы собираемся понимать правильный путь …
- Как можно использовать угловой роутер?
- Как защитить угловой роутер?
- Как установить название динамического документа при изменении страницы маршрута?
- Как сделать компонент хлебовщиков?
В этом проекте мы используем 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”