我创建了一个 CanDeactivate 守卫,它返回一个可观察对象,并将其应用于加载到内部嵌套路由器插座中的组件。每当尝试导航到另一个 url 时是否应该调用这个守卫?我问这个是因为这在我的情况下没有发生。
在我的例子中,守卫只会被调用第一个“不同”的 URL。让我试着用一个例子来解释它。假设我总是返回 false 并且我试图从同一个组件导航到不同的 url:
/A --> guard called
/B --> guard called
/B --> no navigation and no guard called
/A --> guard called
/A -->guard not called and no navigation
这是预期的行为吗?
编辑好吧,似乎是这样。刚刚构建了一个包含 3 个组件的小示例,并且只会在用户第一次尝试导航到特定 url 时调用警卫......这真的很奇怪......
无论如何,这是我正在使用的代码:
// app.routing
import {NgModule} from "@angular/core";
import {Routes, RouterModule, Route, CanDeactivate, ActivatedRouteSnapshot,
RouterStateSnapshot} from "@angular/router";
import { MainComponent } from "./main/main.component";
import { OtherComponent } from "./other/other.component";
import { Other3Component } from "./other3/other3.component";
import {Observable} from "rxjs/observable";
const fallback: Route = {
path: "**",
redirectTo: "/main",
pathMatch: "full"
};
export class Test implements CanDeactivate<MainComponent>{
canDeactivate(component: MainComponent, route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | boolean{
console.log("in");
return false;
}
}
export const rotas: Routes = [
{
path: "main",
component: MainComponent,
canDeactivate: [Test]
},
{
path: "other",
component: OtherComponent
},
{
path: "other3",
component: Other3Component
},
fallback
];
@NgModule({
imports: [RouterModule.forRoot(rotas)],
exports: [RouterModule]
})
export class AppRoutingModule{}
//app.component.html
<h1>
<a routerLink="/main">Main</a>
<a routerLink="/other">Other</a>
<a routerLink="/other3">Other3</a>
</h1>
一切都是通过 angular-cli 生成的(例如:ng component XXX)。是的,CanDeactivate 守卫将始终返回 false,因此您将无法卸载主要组件。所以,当我第一次点击其他时,守卫被召唤了。如果再次单击其他,则不会调用任何守卫。但是,如果我点击 other3,那么守卫就会被召唤。在我点击其他链接(例如:其他)之前,点击 other3 不会真正做任何事情......
这是预期的行为吗?我必须说,我希望每次我点击另一个链接时我的后卫都会受到打击......
谢谢。
路易斯