Внедрение отмены в веб-приложении
Я создаю редактирование карт 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, тогда будут отслеживаться дополнения и удаления из этого массива.