clojure - Om Next 的 query->ast 和 ast->query 函数

标签 clojure clojurescript om

根据 Om Next's documentation :

query->ast

(om.next/query->ast '[(:foo {:bar 1})])

Given a query expression return the AST.

ast->query

(om.next/ast->query ast)

Given a query expression AST, unparse it into a query expression.


问题:为什么需要这些功能?也就是说,为什么需要直接在 om 中操作查询抽象语法树(我假设它是代表查询树的 clojure 映射以及一些元数据)?

最佳答案

在某些情况下,您需要直接操作查询 ast。在远程解析模式下,解析器希望您的读取函数返回 {:remote-name true } 或(可能已修改){:remote-name AST-node}(在 env 中作为 :ast 出现)。大多数情况下,您必须修改 AST 以重构它或添加一些数据。

示例 1:
您有疑问:[{:widget {:list [:name :created]}}]:widget部分是纯 UI 相关的,您的服务器不需要知道它的存在,它只关心/知道 :list .
基本上你必须在解析器中修改 AST:

(defmethod read :list
  [{:keys [ast query state]} key _ ]
  (let [st @state]
    {:value (om/db->tree query (get st key) st)
     :remote (assoc ast :query-root true)}))

如果您使用 om/process-roots在您的发送函数中,它会接收 :query-root退出 ast 并重写来自 [{:widget {:list [:name :created]}}] 的查询至 [{:list [:name :created]}] .

示例 2:
另一个例子是当你想在远程改变某些东西时:
(defmethod mutate 'item/update
  [{:keys [state ast]} key {:keys [id title]}]
  {:remote (assoc ast :params {:data {:id id :title title })})

这里需要明确告诉 Om 将要发送的数据包含在 AST 中。然后在您的 Remote 上拆开 :data更新给定 id 的标题

大多数情况下,您不会直接使用您在问题中描述的功能。 env在解析器的每个方法中可用的都有 ast在里面。

关于clojure - Om Next 的 query->ast 和 ast->query 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35675766/

相关文章:

clojure - 为组件数据中缺少的键设置初始状态

java - Swing 的 Clojure 库 : externalized/runtime editable definition?

clojure - 使用leiningen别名指定JVM标志

clojure - 为什么 Clojure 向量用于传递键值对?

javascript - JavaScript 对象的 ClojureScript 深度相等

javascript - 从 Clojurescript 创建一个 NodeJS 可运行的单个 javascript 文件

clojure - 这个 "#"在这个 Clojure 上下文中是什么意思?

clojurescript - 如何检查 om 对象?

clojure - 函数式编程中的条件 "assignment"

regex - 将 url 查询字符串解析为 clojure 映射