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/