Javascript 是否可以在角度布线中停用两条相同的路径(因此一次只有一条处于活动状态)?

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

是否可以停用2条相同的路径,其中防护装置仅在角度9中重定向?我尝试了此操作,但当LogoutGuard返回false时,第一个仍处于活动状态:

  { path: '', redirectTo: 'login', pathMatch: 'full', canActivate: [LogoutGuard] },
  { path: '', redirectTo: 'home', pathMatch: 'full', canActivate: [LoginGuard] },
在本例中,Logouter返回
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
你的问题
  • 您总是希望从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

演示: