为什么我的查询没有传递给我的读者?

时间:2016-12-22 07:37:20

标签: clojurescript om

问题

我的网页只有输出:{: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参数。困惑。

1 个答案:

答案 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。因此,您可以通过以下方式访问查询的keyparams