-
Notifications
You must be signed in to change notification settings - Fork 132
canDeactivate passes wrong component as first argument #447
Description
###Environment:
"dependencies": {
"@angular/animations": "9.1.2",
"@angular/common": "^9.1.2",
"@angular/compiler": "^9.1.2",
"@angular/core": "^9.1.2",
"@angular/forms": "^9.1.2",
"@angular/platform-browser": "^9.1.2",
"@angular/platform-browser-dynamic": "^9.1.2",
"@angular/router": "^9.1.2",
"core-js": "^3.6.4",
"rxjs": "^6.5.4",
"tslib": "^1.11.1",
"zone.js": "^0.10.3"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.901.1",
"@angular/cli": "^9.1.1",
"@angular/compiler-cli": "9.1.2",
"@angular/language-service": "9.1.2",
Overview of the Issue
Consider the following routing tree:
which has canDeactivate guard
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot } from '@angular/router';
import { SubAComponent } from './sub-a.component';
@Injectable()
export class SubACanDeactivateGuard implements CanDeactivate<SubAComponent> {
public canDeactivate(
component: SubAComponent,
_route: ActivatedRouteSnapshot,
_state: RouterStateSnapshot
): boolean {
console.log('SubACanDeactivateGuard: ', component);
return true;
}
}The guard is attached to SubAComponent
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { SubAComponent } from './sub-a.component';
import { SubACanDeactivateGuard } from './sub-a-can-deactivate.guard';
const routes: Routes = [
{ path: '', component: SubAComponent, canDeactivate: [SubACanDeactivateGuard] }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
declarations: [SubAComponent],
providers: [SubACanDeactivateGuard]
})
export class SubAModule {}Then if I navigate from sub-a route to b route then the canDeactivate guard will be called with the instance of the AComponent, while it used to be called with the instance of SubAComponent.
If I navigate from sub-a to a, then the guard is called with the proper instance of SubAComponent.
Expected behavior
From my understanding, the guard should only be called with SubAComponent.
is it a regression?
Possibly
Reproduce the Error
The following is router v9.1.2 example which shows broken behavior:
https://stackblitz.com/edit/angular-candeactivate-issue-ng9
And the example with the router v9.1.0 which shows I would assume proper behavior
https://stackblitz.com/edit/angular-candeactivate-issue-ng9-router910
In both cases:
- open the link
- open the console
- click on the appropriate links for redirection
- check the logs in the console
Possibly related to
angular/angular@8e7f903
angular/angular#34614
angular/angular#36302