Внедрение отмены в веб-приложении

Я создаю редактирование карт webapp, где мы можем создавать и редактировать полилинии, полигоны и т.д. У меня есть некоторые проблемы с поиском информации об отмене реализации в Интернете, я нахожу, что нытье о "нам нужно отменить" и "вот мой Command pattern using closures", но я думаю, что между этим и полным интерфейсом undo/redo есть довольно некоторая дорога.

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

  • Должен ли я управлять стеком или есть способ отправить мои команды в стек браузера? (и как я могу обрабатывать собственные команды, например текстовые изменения в текстовых полях)
  • как мне обрабатывать "сжатие команд" (группировка команд), когда некоторые команды являются родными браузерами.
  • Как определить отмену нажатия (ctrl + z)?
  • Если я зарегистрирую событие keyup, как мне решить, препятствует ли я умолчанию по умолчанию или нет?
  • Если нет, могу ли я зарегистрировать какой-нибудь обработчик отмены?
  • Пользователи не используются для отмены в Интернете, как я могу "обучить" их исследованию/отмене моего приложения?

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

Ответы

Ответ 1

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

Демо-код показывает холст, но код агностик.

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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