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
      ],
    },
   ...
}];

https://angular.io/api/router/RunGuardsAndResolvers