我正在尝试使用canDeactivate路由器守卫。我传入的组件(ClaimsViewComponent)在代码第一次运行时为空。但在随后的运行中,代码会按预期运行。我们试图弄清楚为什么组件在第一次运行时是空的。
这是canDeactivate保护代码:
@Injectable()
export class ConfirmDeactivateGuard implements
CanDeactivate<ClaimsViewComponent> {
canDeactivate(target: ClaimsViewComponent): boolean {
if (target.canDeactivate()) {
return window.confirm('Do you really want to cancel?');
}
return true;
}
}这是路由模块代码:
const routes: Routes = [
{ path: ':type', component: ClaimsViewComponent, canDeactivate:
[ConfirmDeactivateGuard] }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})下面是完整的错误堆栈:
TypeError: Cannot read property 'canDeactivate' of null
at ConfirmDeactivateGuard.canDeactivate (confirm-deactivate-guard.ts:16)
at MergeMapSubscriber.eval [as project] (router.js:3933)
at MergeMapSubscriber._tryNext (mergeMap.js:128)
at MergeMapSubscriber._next (mergeMap.js:118)
at MergeMapSubscriber.Subscriber.next (Subscriber.js:95)
at ArrayObservable._subscribe (ArrayObservable.js:116)
at ArrayObservable.Observable._trySubscribe (Observable.js:172)
at ArrayObservable.Observable.subscribe (Observable.js:160)
at MergeMapOperator.call (mergeMap.js:92)
at Observable.subscribe (Observable.js:157)
at ConfirmDeactivateGuard.canDeactivate (confirm-deactivate-guard.ts:16)
at MergeMapSubscriber.eval [as project] (router.js:3933)
at MergeMapSubscriber._tryNext (mergeMap.js:128)
at MergeMapSubscriber._next (mergeMap.js:118)
at MergeMapSubscriber.Subscriber.next (Subscriber.js:95)
at ArrayObservable._subscribe (ArrayObservable.js:116)
at ArrayObservable.Observable._trySubscribe (Observable.js:172)
at ArrayObservable.Observable.subscribe (Observable.js:160)
at MergeMapOperator.call (mergeMap.js:92)
at Observable.subscribe (Observable.js:157)
at resolvePromise (zone.js:814)
at resolvePromise (zone.js:771)
at eval (zone.js:873)
at ZoneDelegate.invokeTask (zone.js:421)
at Object.onInvokeTask (core.js:4740)
at ZoneDelegate.invokeTask (zone.js:420)
at Zone.runTask (zone.js:188)
at drainMicroTaskQueue (zone.js:595)谢谢。
发布于 2019-05-22 17:40:19
我通过在我的page.module.ts中添加canDeactivate而不是app.module.ts修复了这个问题
发布于 2019-05-02 17:33:30
看起来,canDeactivate没有在“延迟加载”上工作。请检查您的路由,并确保已设置component属性。
使用@rohan-sampat反馈更新。
它起作用了。在我的项目中,我也遇到了CanDeactivate的问题。
CanDeactivate-guard.service.ts
import { Observable } from 'rxjs';
import { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
export interface CanComponentDeactivate {
canComDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
}
export class CanDeactivateGuard implements CanDeactivate<CanComponentDeactivate> {
canDeactivate(component: CanComponentDeactivate,
currentRoute: ActivatedRouteSnapshot,
currentState: RouterStateSnapshot,
nextState?: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return component.canComDeactivate();
}
}这就是我使用CanDeactivate进行验证的组件。
import { Component, EventEmitter, Output, OnInit } from "@angular/core";
import { DataService } from '../Shared/Service/DataService';
import { ActivatedRoute } from '@angular/router';
import { Subscription, Observable } from 'rxjs';
import { CanComponentDeactivate } from '../can-deactivate-guard.service';
@Component({
selector: 'app-server',
templateUrl: './server.component.html'
})
export class ServerComponent implements OnInit, CanComponentDeactivate {
@Output() serverCreated = new EventEmitter<string>();
queryParams: Subscription;
data: string;
canMove: false;
userModel: any;
constructor(private dataService: DataService, private route: ActivatedRoute) {
}
ngOnInit() {
this.dataService.dataUpdate.subscribe(data => {
this.data = data;
})
this.queryParams = this.route.queryParams.subscribe(data => {
this.userModel = JSON.parse(data["model"]);
})
}
canComDeactivate(): Observable<boolean> | Promise<boolean> | boolean {
if (this.data == undefined || this.data == "") {
var res = confirm("Text is blank");
return res;
}
return this.canMove;
}
}我在其中定义了路由的app.module.ts文件。
const appRoutes: Routes = [
// { path: '', loadChildren: () => import('./Login/login.module').then(l => l.LoginModule) },
{ path: 'login', loadChildren: () => import('./Login/login.module').then(l => l.LoginModule) },
{ path: 'server', canActivate: [AuthGuard], canDeactivate: [CanDeactivateGuard], loadChildren: () => import('./severs/server.module').then(s => s.ServerModule) },
{ path: '**', component: ErrorComponent },
];路径服务器上的CanDeactivate导致了问题。如果我试图转到模块外的另一条路径,那么id甚至不会命中CanDeactivate守卫。
但是如果我将CanDeactivate从app.module放到server.routes文件中,这意味着在延迟加载的模块本身中验证它,那么它就像预期的那样工作正常。
Server.route.ts文件
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { ServerComponent } from './server.component';
import { ErrorComponent } from './404.component';
import { CanDeactivateGuard } from '../can-deactivate-guard.service';
const route: Routes = [
{ path: '', component: ServerComponent },
{ path: 'server:/model', component: ServerComponent, canDeactivate: [CanDeactivateGuard] },
{ path: 'server', component: ServerComponent, canDeactivate: [CanDeactivateGuard] },
{ path: 'not-found', component: ServerComponent },
//{ path: '**', component: ErrorComponent },
]
@NgModule({
imports: [RouterModule.forChild(route)],
exports: [RouterModule]
})
export class ServerRoute { }现在,在这个解决方案更改之后,我的代码就可以正常工作了。希望这能有所帮助。
https://stackoverflow.com/questions/51450323
复制相似问题