Как реализовать отмену и повтор в приложении типа crud при использовании реагента и рефрейминга?

Хотя на домашней странице рефрейминга написано, что «сохранение и отмена становятся довольно простыми», пример приложения рефрейминга todomvc не имеет кода, реализующего функцию отмены/повтора.

При использовании объектно-ориентированного языка, такого как Java, обычной практикой является реализация отмены/возврата с помощью командного интерфейса для выполняемых действий, сохранение их с их «инверсиями» и (повторное) выполнение из набора сохраненных объектов команд.

Хотя я прочитал страницу эквивалентов Clojure общих шаблонов проектирования OO включая Command здесь. было бы полезно увидеть отмену/возврат, реализованную с помощью реагента, рефрейминга в каком-то примере или приложении.

Вопрос. Как реализовать отмену и повтор операций в приложениях грубого типа при использовании реагента и повторного кадрирования?


person nilo de roock    schedule 19.05.2016    source источник


Ответы (2)


Re-frame на самом деле имеет встроенное undoable промежуточное ПО для обработчиков. К сожалению, (в остальном отличный) документ вообще не распространяется на это; Я понял, как это работает, только взглянув на исходный код.

Использовать его довольно просто:

(register-handler :your-handler
  ; this middleware from re-frame.core is all you need to enable undo
  (undoable "String that explains your action, optional")
  (fn [db [_]] ...))

После этого, если вы хотите отменить действие, просто (dispatch [:undo]). Чтобы повторно применить действие, это (dispatch [:redo]).

Промежуточное ПО работает скрытно, просто сохраняя измененные версии вашего app-db между каждым вызовом. Максимальная глубина отмены по умолчанию равна 50.

Для получения дополнительной информации прочитайте этот файл. и этот.

person Thach Mai    schedule 19.05.2016
comment
Крошечная поправка к сказанному выше (почти на уровне придирок). Это (dispatch [:undo]) и (dispatch [:redo]) - person Mike Thompson; 23.05.2016
comment
@MikeThompson: я вовсе не думаю, что это придирки; спасибо за исправление синтаксической ошибки! Я исправил свой ответ соответственно. - person Thach Mai; 23.05.2016

Один из подходов состоит в том, чтобы просто хранить историю состояний — это будет эффективно использовать память, поскольку Clojure (Script) фактически будет хранить ее как историю изменений под капотом.

См. эту ссылку, где приведен очень короткий и понятный пример. !

person Aleph Aleph    schedule 19.05.2016