An add-on to conditionally prompt the user when transitioning between routes or closing the browser.
This library is tested against Ember 1.13.x and Ember 2.x.
ember install ember-onbeforeunload
To get started, mix the ConfirmationMixin
into your Ember.Route
. By default,
the user will be prompted beforeunload any time the model
for the route
hasDirtyAttributes
(docs).
// app/routes/foo.js
import Ember from 'ember';
import ConfirmationMixin from 'ember-onbeforeunload/mixins/confirmation';
export default Ember.Route.extend(ConfirmationMixin, { });
This addon tries to provide sane defaults, but it also exposes all of the internals for customization.
You can customize the message displayed in the confirmation dialog by overriding
the confirmationMessage
property. You can either pass a hard-coded string,
or use a function.
export default Ember.Route.extend(ConfirmationMixin, {
confirmationMessage: 'Are you sure?',
});
export default Ember.Route.extend(ConfirmationMixin, {
confirmationMessage(model) {
return `Are you sure you want to unload ${model.name}?`;
}
});
export default Ember.Route.extend(ConfirmationMixin, {
i18n: service(), // see ember-i18n
confirmationMessage() {
return this.get('i18n').t('myTranslation');
}
});
If you do not sure Ember Data, or you have other logic to determine whether or
not the page is dirty, you can override the isPageDirty
method.
export default Ember.Route.extend(ConfirmationMixin, {
isPageDirty(/* model */) {
const isDirty = true; // your logic here
return isDirty;
}
});
By default, we allow navigating within the hierarchy of route you mix the
ConfirmationMixin
into. For example, navigating from myroute.index
to
myroute.index.subroute
would not check isPageDirty
. If you have other logic
that determines when a dirty transition should be allowed, you can override
shouldCheckIsPageDirty
.
export default Ember.Route.extend(ConfirmationMixin, {
shouldCheckIsPageDirty(transition) {
const isChildRouteTransition = this._super(...arguments);
if (transition.targetName === 'some-exempt-route') {
return true;
} else {
return isChildRouteTransition;
}
}
});
If you have some custom logic you'd like to execute when your route is unloaded,
you can tie into the onUnload
function. By default, this function is a no-op.
export default Ember.Route.extend(ConfirmationMixin, {
onUnload() {
// my custom unload logic
}
});
This library underwent major API changes with version 1.0.0. For information on how to upgrade, please check out UPGRADING.md.
Found a bug? Please report it!
git clone
this repositorynpm install
bower install
npm run lint:js
npm run lint:js -- --fix
ember test
– Runs the test suite on the current Ember versionember test --server
– Runs the test suite in "watch mode"npm test
– Runsember try:each
to test your addon against multiple Ember versions
ember serve
- Visit the dummy application at http://localhost:4200.
For more information on using ember-cli, visit http://www.ember-cli.com/.