Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

canDeactivate passes wrong component as first argument #447

@mike-co

Description

@mike-co

###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:
image
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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions