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 clonethis repositorynpm installbower install
npm run lint:jsnpm 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:eachto 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/.