3

尽管在 re-frame 主页上显示“保存和撤消变得非常容易。”,re-frame 示例应用程序“todomvc”没有实现撤消/重做功能的代码。

当使用像 Java 这样的 OO 语言时,通常的做法是通过使用命令接口执行操作来实现撤消/重做,将这些操作与其“逆”一起存储,并从存储的命令对象的集合中(重新)执行这些操作。

虽然我已经阅读了常见 OO 设计模式的 Clojure 等效页面,包括此处的命令。在某些示例或应用程序中查看使用试剂实现撤消/重做,重新构建框架会很有帮助。

Q.在crud类型的应用程序中使用reagent和re-frame时如何实现undo和redo?

4

2 回答 2

4

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。

有关更多信息,请阅读此文件文件。

于 2016-05-19T23:46:48.333 回答
3

其中一种方法是仅存储状态历史记录——这将节省内存,因为 Clojure(Script) 实际上会将其存储为引擎盖下的更改历史记录。

请参阅此链接以获取一个非常简短且清晰的示例!

于 2016-05-19T13:53:47.070 回答