This is the code from the Ember guides on aborting a transition in Ember 4.12.
@service router;
constructor() {
super(...arguments);
this.router.on('routeWillChange', (transition) => {
if (
!transition.to.find((route) => route.name === this.routeName) &&
!confirm('Are you sure you want to abandon progress?')
) {
transition.abort();
}
});
}
If this same exact code is present in the target route, and I keep clicking cancel in the confirm/cancel dialogue, you get an infinite loop back and forth between the two routes.
For context, all routes in my application extend a parent route, which causes any transition to be aborted if the freezeNav
prop is set on the session service. When using willTransition
this worked fine, but having refactored to use router.on('routeWillChange...
I get this infinite loop issue.
It seems that the router gets confused about the value of this.routeName
, always thinking that this is the name of the target route, despite the transition being aborted.
Does anyone have any idea what causes this?