Реализация отмены в веб-приложении - PullRequest
15 голосов
/ 17 июня 2011

Я создаю веб-приложение для редактирования карт, в котором мы можем создавать и редактировать полилинии, многоугольники и т. Д. У меня есть некоторые проблемы с поиском информации о реализации отмены в Интернете, я нахожу нытье по поводу «нам нужно отменить» и «вот мой Шаблон команды с использованием замыканий ", но я думаю, что между этим и полным интерфейсом отмены / возврата есть довольно большой путь.

Итак, вот мои вопросы (я думаю, это хороший кандидат на вики):

  • Должен ли I управлять стеком, или есть способ отправить мои команды в стек браузера? (и как мне обрабатывать собственные команды, такие как редактирование текста в текстовых полях в этом случае)
  • как мне обрабатывать «сжатие команд» (группирование команд), когда некоторые команды являются родными для браузера
  • Как я могу обнаружить отмену (Ctrl + Z) нажатие клавиши?
  • Если я зарегистрирую событие keyup, как мне решить, запретить ли мне дефолт или нет?
  • Если нет, могу я где-нибудь зарегистрировать какой-нибудь обработчик undoevent?
  • Пользователи не используются для отмены в Интернете, как я могу "обучить" их исследовать / отменять в моем приложении?

Спасибо всем.

Ответы [ 3 ]

10 голосов
/ 11 августа 2011

Вам необходимо иметь функции для создания и удаления объектов. Затем передайте эти функции менеджеру по отмене. Смотрите демонстрационный файл моего менеджера отмены javascript: https://github.com/ArthurClemens/Javascript-Undo-Manager

Демонстрационный код показывает canvas, но код является независимым.

Он не содержит привязок клавиш, но может помочь вам с первыми шагами.

Я сам использовал это в веб-приложении с кнопками для отмены и повтора, рядом с сохранением.

5 голосов
/ 30 сентября 2011

Вот пример отмены N-уровня с использованием Knockout JS:

http://jsfiddle.net/paultyng/TmvCs/22/

Используется модель MVVM, поэтому состояние вашей страницы представлено в виде объекта javascript, который поддерживаетистория для.

1 голос
/ 18 июня 2011

Способ автоматической поддержки отмены Cappuccino работает, сообщая менеджеру отмены действий, какие свойства следует отменить. Например, представьте, что вы управляете записями студентов, вы можете сделать что-то вроде:

[theUndoManager observeChangesForKeyPath:@"firstName" ofObject:theStudent];
[theUndoManager observeChangesForKeyPath:@"lastName" ofObject:theStudent];

Теперь, независимо от того, как имя ученика изменяется в пользовательском интерфейсе, нажатие отмены автоматически вернет его обратно. Cappuccino также автоматически обрабатывает объединяющиеся изменения в одном и том же цикле выполнения, помечая документ как «грязный» (нуждающийся в сохранении), когда есть элементы в стеке отмены, и т. Д. И т. Д. (Другими словами, вышеприведенное должно быть ВСЕ, что вам нужно сделать для поддержки отменить).

В качестве другого примера, если вы хотите, чтобы добавления и удаления учеников были отменены, вы бы сделали следующее:

[theUndoManager observeChangesForKeyPath:@"students" ofObject:theClass];

Поскольку "ученики" - это массив учеников в классе, то добавления и удаления из этого массива будут отслеживаться.

...