angular2:为相同的路由和组件调用 canDeactivate 但参数不同
angular2: call canDeactivate for same route and component but different parameters
在我的应用程序中,有多个链接具有相同的路由但具有不同的查询参数和片段。
例如,我有这样的链接:
.../pages/golestan/npform?fid=26270#26270
.../pages/golestan/npform?fid=26280#26280
.../pages/golestan/npform?fid=26290#26290
当我在上述路线之一并通过不同的参数导航到同一路线时,路线没有改变,但通过更改 RouteReuseStrategy 解决了这个问题。
现在我想调用 canDeactivate 来更改路由,当我导航到其他路由时调用了 canDeactivate,但是当我通过不同的 queryParams 和片段导航到同一路由时,没有调用 canDeactivate!
const routes: Routes = [{
...
{
path: 'npform',
component: NpFormComponent,
canDeactivate: [
NpFormGuard
],
},
...
}];
@NgModule({
declarations: [
NpFormComponent
],
imports: [ ...
RouterModule.forChild(routes)
],
providers: [
NpFormGuard
]
})
export class GolestanModule { }
@Injectable({providedIn: 'root'})
export class NpFormGuard implements CanDeactivate<KoFormComponent> {
canDeactivate(
component: NpFormComponent,
currentRoute: ActivatedRouteSnapshot,
currentState: RouterStateSnapshot,
nextState?: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree
{
return !component.webBusy;
}
}
import { Router } from '@angular/router';
constructor(private router: Router) {
this.router.routeReuseStrategy.shouldReuseRoute = (future: ActivatedRouteSnapshot, current: ActivatedRouteSnapshot) => {
const defaultReuse = (future.routeConfig === current.routeConfig);
if(future.routeConfig&&future.routeConfig.path=='npform'&&
(future.queryParams.fid||current.queryParams.fid)&&(future.queryParams.fid!=current.queryParams.fid))
return false;
return defaultReuse;
};
}
我的问题是通过使用 RunGuardsAndResolvers 参数并将其设置为 'always' 解决的。
这个配置运行每次都守着
const routes: Routes = [{
...
{
path: 'npform',
component: NpFormComponent,
runGuardsAndResolvers: 'always',
canDeactivate: [
NpFormGuard
],
},
...
}];
在我的应用程序中,有多个链接具有相同的路由但具有不同的查询参数和片段。
例如,我有这样的链接:
.../pages/golestan/npform?fid=26270#26270
.../pages/golestan/npform?fid=26280#26280
.../pages/golestan/npform?fid=26290#26290
当我在上述路线之一并通过不同的参数导航到同一路线时,路线没有改变,但通过更改 RouteReuseStrategy 解决了这个问题。 现在我想调用 canDeactivate 来更改路由,当我导航到其他路由时调用了 canDeactivate,但是当我通过不同的 queryParams 和片段导航到同一路由时,没有调用 canDeactivate!
const routes: Routes = [{
...
{
path: 'npform',
component: NpFormComponent,
canDeactivate: [
NpFormGuard
],
},
...
}];
@NgModule({
declarations: [
NpFormComponent
],
imports: [ ...
RouterModule.forChild(routes)
],
providers: [
NpFormGuard
]
})
export class GolestanModule { }
@Injectable({providedIn: 'root'})
export class NpFormGuard implements CanDeactivate<KoFormComponent> {
canDeactivate(
component: NpFormComponent,
currentRoute: ActivatedRouteSnapshot,
currentState: RouterStateSnapshot,
nextState?: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree
{
return !component.webBusy;
}
}
import { Router } from '@angular/router';
constructor(private router: Router) {
this.router.routeReuseStrategy.shouldReuseRoute = (future: ActivatedRouteSnapshot, current: ActivatedRouteSnapshot) => {
const defaultReuse = (future.routeConfig === current.routeConfig);
if(future.routeConfig&&future.routeConfig.path=='npform'&&
(future.queryParams.fid||current.queryParams.fid)&&(future.queryParams.fid!=current.queryParams.fid))
return false;
return defaultReuse;
};
}
我的问题是通过使用 RunGuardsAndResolvers 参数并将其设置为 'always' 解决的。 这个配置运行每次都守着
const routes: Routes = [{
...
{
path: 'npform',
component: NpFormComponent,
runGuardsAndResolvers: 'always',
canDeactivate: [
NpFormGuard
],
},
...
}];