Подтвердить что ты не робот

Маршрутизация Ember.js - условно предотвращает изменение маршрута/состояния

Я пытаюсь выяснить, как предотвратить или приостановить изменение маршрута. Для моих экранов редактирования, если пользователь перемещается (кнопка "Назад" или какой-либо другой механизм), когда у них есть несохраненные изменения, я хотел бы предложить им убедиться, что они хотят покинуть страницу. Очень похоже на window.onbeforeunload, но через маршрутизатор.

Шаблон состояния в предыдущих версиях Ember дал вам объект перехода, который вы могли бы использовать. Кажется, что в последнее время это уже не так. Итак, что лучший способ сделать это?


EDIT:

Вышеупомянутый вопрос является старым, и указанные ответы датированы. У Ember теперь есть собственный способ справиться с этим. См. Документы: http://emberjs.com/guides/routing/preventing-and-retrying-transitions/

4b9b3361

Ответ 2

Что вы хотите сделать, это сделать ваши переходы условными. Вместо прямого использования 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/ для примера.

Ответ 3

Я не уверен, что это возможно, так как есть (возможно, я что-то пропустил), никакой обработчик не доступен перед выходом из состояния. Глядя на запуск состояния ввода и код enterState(), он похоже, что вы не можете прерывать или отменять переход между двумя состояниями.

Я думаю, это объясняется Томом Дейлом в Разрешить отмену перехода состояния.

В вашем случае, возможно, вы могли бы объявить промежуточное состояние ответственным либо перенаправить на предыдущее состояние, если пользователь отменит, либо перейти в новое состояние, если пользователь согласится. Я должен сказать, что писать легче, чем реализовать: (