Javascript 是否可以在角度布线中停用两条相同的路径(因此一次只有一条处于活动状态)?
是否可以停用2条相同的路径,其中防护装置仅在角度9中重定向?我尝试了此操作,但当LogoutGuard返回false时,第一个仍处于活动状态:Javascript 是否可以在角度布线中停用两条相同的路径(因此一次只有一条处于活动状态)?,javascript,node.js,angular,angular-routing,Javascript,Node.js,Angular,Angular Routing,是否可以停用2条相同的路径,其中防护装置仅在角度9中重定向?我尝试了此操作,但当LogoutGuard返回false时,第一个仍处于活动状态: { path: '', redirectTo: 'login', pathMatch: 'full', canActivate: [LogoutGuard] }, { path: '', redirectTo: 'home', pathMatch: 'full', canActivate: [LoginGuard] }, 在本例中,Logout
{ path: '', redirectTo: 'login', pathMatch: 'full', canActivate: [LogoutGuard] },
{ path: '', redirectTo: 'home', pathMatch: 'full', canActivate: [LoginGuard] },
在本例中,Logouter返回false
和LoginRoutertrue
因此,发生的情况如下:
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
你的问题
- 您总是希望从url重定向
/
- 如果用户已登录,
应重定向到/
/home
- 如果用户已注销,
应重定向到/
/login
重定向到
属性和激活
保护。您希望防护被检查,并且无论哪个返回true
都会通知路由器重定向到相应的重定向到
路径
这取决于角度路由器按特定顺序检查特定条件,这显然是不可能的
我的解决方案
将两个防护装置添加到单个管线
{路径:'',组件:AppComponent,canActivate:[LoginGuard,LogoutGuard]},
警卫将返回true
或false
,而不是直接返回true
或要导航到的url
login.guard.ts
@可注入({
providedIn:'根'
})
导出类LoginGard实现CanActivate{
构造函数(专用路由器:路由器){}
canActivate():布尔| UrlTree{
const loggedIn=true;//TODO:实现
if(loggedIn){
返回true;
}
返回此.router.parseUrl('login');
}
}
logout.guard.ts
@可注入({
providedIn:'根'
})
导出类LogoutGuard实现CanActivate{
构造函数(专用路由器:路由器){}
canActivate():布尔| UrlTree{
const loggedIn=true;//TODO:实现
如果(!loggedIn){
返回true;
}
返回此.router.parseUrl('home');
}
}
从这里开始的自然步骤是创建一个基本保护,该保护被注入它应该允许通过的身份验证状态和重定向到的url
演示: