问题
我的网页只有以下代码的输出:{:user {}}。
(ns omn1.core
(:require
[om.next :as om :refer-macros [defui]]
[om.dom :as dom :refer [div]]
[goog.dom :as gdom]))
(defui MyComponent
static om/IQuery
(query [this] [:user])
Object
(render
[this]
(let [data (om/props this)]
(div nil (str data)))))
(def app-state (atom {:user {:name "Fenton"}}))
(defn reader [{q :query st :state} _ _]
(.log js/console (str "q: " q))
{:value (om/db->tree q @app-state @app-state)})
(def parser (om/parser {:read reader}))
(def reconciler
(om/reconciler
{:state app-state
:parser parser}))
(om/add-root! reconciler MyComponent (gdom/getElement "app"))当我检查浏览器控制台时,我注意到我的查询是空的。为什么不把它传递给我的阅读器函数呢?
这来自于一个动机,使我的代码尽可能保持最小的LOC #,也是干的。因此,我希望有一个读取功能,将与适当设置的数据库,和正常的名义查询。如果您将常规查询传递给om/db->tree,db->tree确实可以做到这一点。db->tree将接受任何适当的查询,并返回一个填充的数据树。也许另一种表达这个问题的方式是,有人可以演示一个这样做的阅读器功能吗?即利用db->tree来解析查询的值。我不想为每个查询都编写一个自定义的阅读器。如果我的所有查询都遵循常规查询语法,并且我的DB格式正确,那么我应该能够使用一个读取器函数,不是吗?
om.next快速入门-使用链接思考中提供的示例不起作用:
(defmethod read :items
[{:keys [query state]} k _]
(let [st @state]
{:value (om/db->tree query (get st k) st)}))如前所述,query有时是nil的,第二个和第三个参数不同于测试中提出的如何使用这个函数,所有测试都使用:st作为第二和第三个参数。迷惑了。
发布于 2016-12-23 00:41:19
来自Om.Next快速入门教程(https://github.com/omcljs/om/wiki/Quick-Start-(om.next),read具有以下签名:
[{:keys [state] :as env} key params]因此不能访问查询数据结构。
通常,设置是为每个查询使用一个多方法,并使用查询的参数返回状态的某一部分:
(defmulti read (fn [env key params] key))
(defmethod read :animals/list
[{:keys [state] :as env} key {:keys [start end]}]
{:value (subvec (:animals/list @state) start end)})这里的:animals/list是查询的key。这就是访问查询的key和params的方法。
https://stackoverflow.com/questions/41277982
复制相似问题