Ember.js маршрутизация - условно предотвратить изменение маршрута / состояния
Я пытаюсь выяснить, как предотвратить или приостановить изменение маршрута. Для моих экранов редактирования, если пользователь уходит (кнопка "Назад" или другой механизм), когда у него есть несохраненные изменения, я хотел бы предложить им убедиться, что они хотят покинуть страницу. Очень похоже на window.onbeforeunload
, но через роутер.
Диаграмма состояний в предыдущих версиях Ember дала вам объект перехода, который вы могли бы использовать. Похоже, что в ember-последнем это уже не так. Так каков наилучший способ сделать это?
РЕДАКТИРОВАТЬ:
Приведенный выше вопрос устарел, а перечисленные ответы датированы. У Ember теперь есть собственный способ справиться с этим. См. Документы: http://emberjs.com/guides/routing/preventing-and-retrying-transitions/
3 ответа
Маршрутизатор Ember теперь имеет встроенный механизм, который делает это очень легко. См. Документы: http://emberjs.com/guides/routing/preventing-and-retrying-transitions/
То, что вы хотите сделать, это сделать ваши переходы условными. Вместо того, чтобы использовать Ember.Route.transitionTo
напрямую, вы хотите что-то вроде:
var transitionAfterConfirmation = function(target){
var defaultEvent = Ember.Route.transitionTo(target),
event = function(stateManager, context){
if( confirm("Really go?")){
defaultEvent(stateManager,context);
}
};
event.transitionTarget = target;
return event;
};
см. http://jsfiddle.net/hjdivad/KsHCN/ для примера.
Я не уверен, что это возможно, поскольку нет (возможно, я что-то пропустил) обработчика, доступного до выхода из состояния. Глядя на запуск ввода состояния и кода enterState(), похоже, что вы не можете прервать или отменить переход между двумя состояниями.
Я думаю, что это объясняется Томом Дейлом в " Разрешить отмену переходов между состояниями".
В вашем случае, возможно, вы могли бы объявить промежуточное состояние ответственным либо за перенаправление в предыдущее состояние, если пользователь отменил, либо за переход в новое состояние, если пользователь принял. Я должен сказать, что легче написать, чем реализовать:(