[英]Is it possible to deactivate two same paths in Angular Routing (so one is only active at a time)?
是否可以使用僅在 Angular 9 中重定向的 Guards 停用 2 個相同的路徑? 我試過了,但是當 LogoutGuard 返回 false 時,第一個仍然處於活動狀態:
{ path: '', redirectTo: 'login', pathMatch: 'full', canActivate: [LogoutGuard] },
{ path: '', redirectTo: 'home', pathMatch: 'full', canActivate: [LoginGuard] },
在這個例子中,LogoutRouter 返回false
和 LoginRouter true
那么會發生以下情況:
Router Event: NavigationStart platform-browser.js:88
NavigationStart(id: 1, url: '/') platform-browser.js:79
Object { id: 1, url: "/", navigationTrigger: "imperative", restoredState: null }
platform-browser.js:79
Angular is running in the development mode. Call enableProdMode() to enable the production mode. core.js:40465
Router Event: RoutesRecognized platform-browser.js:88
RoutesRecognized(id: 1, url: '/', urlAfterRedirects: '/login', state: Route(url:'', path:'') { Route(url:'login', path:'login') { Route(url:'', path:'') } } ) platform-browser.js:79
Object { id: 1, url: "/", urlAfterRedirects: "/login", state: {…} }
platform-browser.js:79
Router Event: GuardsCheckStart platform-browser.js:88
GuardsCheckStart(id: 1, url: '/', urlAfterRedirects: '/login', state: Route(url:'', path:'') { Route(url:'login', path:'login') { Route(url:'', path:'') } } ) platform-browser.js:79
Object { id: 1, url: "/", urlAfterRedirects: "/login", state: {…} }
platform-browser.js:79
Router Event: ChildActivationStart platform-browser.js:88
ChildActivationStart(path: '') platform-browser.js:79
Object { snapshot: {…} }
platform-browser.js:79
Router Event: ActivationStart platform-browser.js:88
ActivationStart(path: 'login') platform-browser.js:79
Object { snapshot: {…} }
platform-browser.js:79
Router Event: GuardsCheckEnd platform-browser.js:88
GuardsCheckEnd(id: 1, url: '/', urlAfterRedirects: '/login', state: Route(url:'', path:'') { Route(url:'login', path:'login') { Route(url:'', path:'') } } , shouldActivate: false) platform-browser.js:79
Object { id: 1, url: "/", urlAfterRedirects: "/login", state: {…}, shouldActivate: false }
platform-browser.js:79
Router Event: NavigationCancel platform-browser.js:88
NavigationCancel(id: 1, url: '/') platform-browser.js:79
Object { id: 1, url: "/", reason: "" }
platform-browser.js:79
/
/
應該重定向到/home
/
應重定向到/login
您已經設置了兩條路徑相同的路由。 每個路由都有不同的redirectTo
屬性和canActivate
防護。 您希望檢查守衛,無論哪個返回true
都會通知路由器重定向到適當的redirectTo
路徑。
這依賴於 Angular 路由器以特定順序檢查特定條件,這顯然不會發生。
將兩個守衛添加到一條路線。
{ path: '', component: AppComponent, canActivate: [LoginGuard, LogoutGuard] },
不是直接返回true
或false
,守衛將返回true
或要導航到的 url 。
登錄.guard.ts
@Injectable({
providedIn: 'root'
})
export class LoginGuard implements CanActivate {
constructor(private router: Router) {}
canActivate(): boolean | UrlTree {
const loggedIn = true; // TODO: implement
if (loggedIn) {
return true;
}
return this.router.parseUrl('login');
}
}
登出.guard.ts
@Injectable({
providedIn: 'root'
})
export class LogoutGuard implements CanActivate {
constructor(private router: Router) {}
canActivate(): boolean | UrlTree {
const loggedIn = true; // TODO: implement
if (!loggedIn) {
return true;
}
return this.router.parseUrl('home');
}
}
從這里開始的自然步驟是創建一個基本守衛,它注入了它應該允許通過的經過身份驗證的狀態和要重定向到的 url。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.