Յուրաքանչյուր Angular հավելված իրականացնում է նավարկություն Route աղյուսակի միջոցով: Փորձված Angular ծրագրավորողները տեղյակ են, թե որքան կարևոր է երթուղու վրա պաշտպաններ ավելացնել՝ ճանապարհն ապահովելու համար:
Կլինեն դեպքեր, երբ մշակողը կարող է պահանջել որոշակի հոսքեր, որոնք օգտագործում են նույն ուղին, որպեսզի այդ երթուղու պահակախմբի կողմից չարգելափակվի: Շատ անգամ ծրագրավորողներից շատերը դա անում են՝ ավելացնելով լրացուցիչ տրամաբանություն պահակում: Սա ինքնին վատ գաղափար չէ, բայց դա նշանակում է, որ պահակը կխփվի և կակտիվանա ամեն անգամ, երբ անցնում է երթուղին, նույնիսկ եթե դա պարտադիր չէ:
Ահա այստեղ է գալիս aop-routingգրադարանը:
Այս հոդվածը կբացատրի, թե ինչպես կարելի է հեշտությամբ թարմացնել Angular երթուղղման աղյուսակը գործարկման ժամանակ՝ նավարկության ընթացքում հեռացնելու կամ ավելացնելու CanActivate պահակները երթուղու վրա՝ օգտագործելով aop-routing գրադարանը:
Angular տարբերակի 11-ի դրությամբ հավելվածի գործարկման ընթացքում CanActivate պաշտպանիչները դինամիկ կերպով ավելացնելու կամ հեռացնելու բնօրինակ եղանակ չկա:
Եթե չեք լսել aop-routingգրադարանի մասին, կարդացեք դրա մասին ավելին այստեղ՝ Aop-routing գրադարան Angular-ի համար
Aop-Routing գրադարանը հնարավորություն է տալիս կատարել Imperative and Popstate navigation գործողություններ Angular-ում տպագրական դեկորատորների հեշտությամբ՝ առանց Angular Router օբյեկտի ներմուծման անհրաժեշտության:
Եկեք սկսենք ավելացնելով aop-գրադարանը մեր անկյունային հավելվածին 3 պարզ քայլով.
- Տեղադրեք aop-routing գրադարանը ձեր անկյունային հավելվածում
npm install aop-routing
2. Գրադարանը տեղադրելուց հետո ավելացրեք AopRoutingModuleձեր հավելվածի վերին մակարդակի/արմատային մոդուլի ներմուծման զանգվածին:
imports: [
...
AopRoutingModule
]
3. Ավելացրեք AopNavigationServiceկախվածությունը ձեր վերին մակարդակի/արմատային մոդուլի կոնստրուկտորին:
export class AppModule {
constructor(private navigationService: AopNavigationService) {}
}
Aop-routing գրադարանի դինամիկ երթուղավորման աղյուսակի թարմացումը միացնելու համար ներմուծման մեջ ավելացրեք հետևյալ օբյեկտը AopRoutingModule-ում.
@NgModule({ … imports: [ … AopRoutingModule.forRoot({expirementNav: true}) ], … })
Ստորև բերված սկզբնական կոդը կարելի է մուտք գործել Stackblitz-ում:
Աղբյուրային կոդը՝
https://stackblitz.com/edit/aop-routing-dynamic-guards?file=src/app/app.component.ts
Դիմում.
https://aop-routing-dynamic-guards.stackblitz.io
Ծանոթագրություն. Որպեսզի տպագիր արդյունքը ճիշտ ցուցադրվի, համոզվեք, որ նավարկեք տարբեր էջեր առաջ և առաջ: Օրինակ, եթե դուք արդեն 3-րդ էջում եք՝ սեղմելով «հեռացնել պահակները 3-րդ էջի վրա» կոճակը և այնուհետև նորից սեղմեք էջ3կոճակը,դուք չեք տեսնի ելքի տարբերությունը, քանի որ անկյունային երթուղային շարժիչը գիտի, որ այն գտնվում է նույն ակտիվացված բաղադրիչի վրա: Ճիշտ փորձարկելու համար նավարկեք ետ ու առաջ տարբեր էջերի միջև՝ համապատասխան արդյունքը տեսնելու համար:
Հետևյալ օրինակների համար մենք կօգտագործենք ստորև բերված երթուղային աղյուսակը.
const routes: Routes = [ { path: "page1", component: Page1Component }, { path: "page2", component: Page2Component, canActivate: [TestGuard2] }, { path: "page3", component: Page3Component, canActivate: [TestGuard2, TestGuard3] }, ];
Վերոնշյալ հատվածից կարելի է ենթադրել հետևյալը.
- Էջ1-ը իր երթուղու վրա պահակ չունի
- Էջ2-ն ունի TestGuard2 իր երթուղու վրա
- էջ3-ն ունի TestGuard2և TestGuard3 իր երթուղու վրա
Ստորև ներկայացված են մեր app.component.ts և app.component.html
AppComponent.ts-ն ունի 3 պարզ մեթոդ, որոնք օգտագործում են aop-routing գրադարանը՝ համապատասխանաբար էջ1, էջ 2 և էջ 3 նավարկելու համար.
import { Component, VERSION } from "@angular/core"; import { RouteNext } from "aop-routing"; @Component({ selector: "my-app", templateUrl: "./app.component.html", styleUrls: ["./app.component.css"] }) export class AppComponent { name = "Angular " + VERSION.major; @RouteNext("page1") public goToNextPage1() { this.setNavigationMessage("Navigating to page1"); this.displayService.guardMsg = ""; } @RouteNext("page2") public goToNextPage2() { this.setNavigationMessage("Navigating to page2"); this.displayService.guardMsg = ""; } @RouteNext("page3") public goToNextPage3() { this.setNavigationMessage("Navigating to page3"); this.displayService.guardMsg = ""; } }
app.component.html
<hello name="{{ name }}"></hello> <p>Start editing to see some magic happen :)</p> <button (click)="goToNextPage1()">Page1</button> <button (click)="goToNextPage2()">Page2</button> <button (click)="goToNextPage3()">Page3</button> <router-outlet></router-outlet>
Ստորև ներկայացված է TestGuard2-ի իրականացումը (բավականին նույն իրականացումը մյուս պահակների համար): Երբ պահակին հարվածեն, այն էկրանին կտպագրի ընկերական «Բարև պահակից x»:
import { Injectable } from "@angular/core"; import { CanActivate } from "@angular/router"; @Injectable({providedIn: "root"}) export class TestGuard2 implements CanActivate { public canActivate(): boolean { this.displayService.addGuardMsg('Hello from guard 2'); return true; }}
Այսպիսով, վերը նշված կոդը ամփոփելու համար, սեղմելով կոճակներից յուրաքանչյուրի վրա, կկոչվի դրա համապատասխան մեթոդը, որը կթողարկի «Նավարկում դեպի էջը»և եթե կա պահակ: այդ էջում պահակը կմտնի «Ողջույն պահակախմբից x» էկրանին
Դինամիկ ճանապարհին պահակ ավելացնելը
Տեսնենք, թե որքան հեշտ է հավելվածի գործարկման ընթացքում էջ1 պաշտպանիչ ավելացնելը:
Նախ եկեք տեսնենք Page1-ի վրա սեղմելու արդյունքը՝ որոշելու համար, որ այն իր երթուղու վրա պահակ չունի:
- Մենք կստեղծենք նոր կոճակ, որը կոչվում է «Page1 with guard», որը կանվանի նոր մեթոդ «addGuardToPage1», որը ստեղծվել է AppComponent.ts-ում:
import { RouteNext, RouteTransform } from "aop-routing"; import { TestGuard1 } from "./pages/guards/testguard1"; @RouteNext() public addGuardToPage1() { this.setNavigationMessage("Navigating to page1 and adding guard"); this.displayService.guardMsg = ""; const routeTransform: RouteTransform = { path: 'page1', canActivateGuards: [TestGuard1] }; return {routeTransform} }
2. Սեղմելով նոր «Page1 with Guard» կոճակը, TestGuard1 կավելացվի էջ1և նավարկեք դեպի այն: Ստորև բերված է ելքը:
Դինամիկ կերպով երթուղուց պաշտպանների հեռացում.
- Մենք կստեղծենք նոր կոճակ, որը կոչվում է «Remove Guard On Page 3», որը կանվանի նոր մեթոդ «removeGuardOnPage3», որը ստեղծվել է AppComponent.ts-ում: Այս մեթոդը կհեռացնի TestGuard2-ըPage3 երթուղուց, բայց դուրս կգա TestGuard3-ից:
@RouteNext() public removeGuardOnPage3() { this.setNavigationMessage("Navigating to page3 and removing TestGuard2 from its path"); this.displayService.guardMsg = ""; const routeTransform: RouteTransform = { path: "page3", canActivateGuards: [TestGuard2] }; return { routeTransform }; }
Հիշեցնենք, որ երբ մենք սեղմում ենք Page3 կոճակը՝ 3-րդ էջը նավարկելու համար, այն հարվածելու է TestGuard2 և TestGuard3, ելքը ստորև:
2. Այժմ, երբ մենք սեղմում ենք «Հեռացնել որոշակի պահակ 3-րդ էջում» կոճակը, դուք կնկատեք, որ նավիգացիան չի հարվածի TestGuard2և մենք այլևս չենք տեսնի արդյունքը: «Ողջույն պահակ 2-ից»
Դուք կնկատեք, որ հատուկ պահակ ավելացնելու և հեռացնելու ծածկագիրը նույնն է: Դա պայմանավորված է նրանով, որ aop-routing գրադարանը խելացի է իմանալու համար, եթե դրա վրա գործողության անցած պահակ արդեն գոյություն ունի, այն կհեռացնի այն, այլապես կավելացնի:
aop-routing գրադարանը խելացի է իմանալու համար, եթե դրա վրա գործողության անցած պահակ արդեն գոյություն ունի, այն կհեռացնի այն, այլապես կավելացնի:
Բոլոր պահակները երթուղուց հեռացնելը.
Բոլոր պահակները երթուղուց հեռացնելը շատ պարզ է, ինչպես նախորդ քայլը, այն ամենը, ինչ պահանջվում էվերադարձնել դատարկ զանգվածը RouteTransform օբյեկտի canActivateGuards հատկություն:
- Մենք կստեղծենք նոր կոճակ, որը կոչվում է «Remove all guard on Page 3», որը կանվանի AppComponent.ts-ում ստեղծված «removeAllGuardOnRoute» նոր մեթոդը: Այս մեթոդը կհեռացնի էջի 3 ուղու բոլոր պաշտպանիչները:
@RouteNext() public removeAllGuardOnRoute() { this.setNavigationMessage("Navigating to page3 and removing all guards in its path"); this.displayService.guardMsg = ""; const routeTransform: RouteTransform = { path: "page3", canActivateGuards: [] }; return { routeTransform }; }
2. Այժմ, երբ մենք սեղմում ենք «Հեռացնել բոլոր պահակները էջի վրա», մենք չենք տեսնի, որ պահակներից որևէ մեկը հարվածել է, կամ նրանց հաղորդագրություններից որևէ մեկը տպվել էկրանին: Մենք կտեսնենք միայն էկրանի վրա տպված «Նավարկում դեպի էջ3 և հեռացնելով բոլոր պահակները իր ճանապարհին»:
Նշում․Մի բան պետք է հիշել՝ երբ aop-routing գրադարանը թարմացնում է երթուղիների աղյուսակը, այն վերադարձնում է իր սկզբնական վիճակին՝ նավիգացիայի ավարտից հետո:
Եթե ձեզ դուր եկավ այս հոդվածը, համոզվեք, որ ստուգեք իմ մյուս հոդվածները ստորև: