我的网页只有输出:{: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数的动机,以及DRY。所以我想有一个读取功能,可以使用正确设置的数据库,以及正常的名义查询。如果您将常规查询传递给om/db->tree
确实db->tree
执行此操作。 db->tree
将采取任何正确的查询并返回填写的数据树。也许用另一种方式来表达这个问题的是,是否有人能够展示出这样做的读者功能?即利用db->tree
来解析查询的值。我不想为每个查询编写自定义阅读器。如果我的所有查询都遵循常规查询语法并且我的数据库格式正确,我应该能够使用一个读取器功能,不是吗?
om.next快速入门中提供的示例 - 使用链接进行思考不起作用:
(defmethod read :items
[{:keys [query state]} k _]
(let [st @state]
{:value (om/db->tree query (get st k) st)}))
如前所述,查询有时是nil
,第2和第3个参数与提议的不同之处在于所有使用的测试如何使用此函数:st
用于第2和第3参数。困惑。
答案 0 :(得分:0)
在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
。