2016-01-07 17 views
3

我目前正在努力學習om.next查詢函數返回值爲零在om.next

這是我的代碼:

(ns hlearn.core 
    (:require [goog.dom :as gdom] 
      [om.next :as om :refer-macros [defui]] 
      [om.dom :as dom] 
      [sablono.core :as html :refer-macros [html]])) 

(enable-console-print!) 

(def app-data 
    (atom {:user "" 
     :main-menu {:selected :home}})) 

;; ------------------------------------------------------------------------- 
;; Parsing 

(defmulti read om/dispatch) 

(defmethod read :selected 
    [{:keys [state]} _ _] 
    {:value (get-in @state [:main-menu :selected])}) 

;; ------------------------------------------------------------------------- 
;; Components 

(defui MainMenu 
    static om/IQuery 
    (query [this] 
     [:selected]) 
    Object 
    (render [this] 
      (let [{:keys [selected]} (om/props this)] 
      (println (= selected :home))))) 

(def main-menu (om/factory MainMenu)) 

(defui RootView 
    Object 
    (render [this] 
    (println "Render RootView") 
    (main-menu))) 

(def reconciler 
    (om/reconciler 
    {:state app-data 
    :parser (om/parser {:read read})})) 

(om/add-root! reconciler 
    RootView (gdom/getElement "app")) 

我在這裏的目標是,組件MainMenu有寫在控制檯上true(目前寫false)。

由於讀取函數應該返回{:value :home}(應用程序狀態的值),因此(= selected :home)應該爲true。

實際上,MainMenu在控制檯上寫入false,因爲selected的值爲nil

回答

2

原來,在(om/add-root!)上呈現的RootView組件必須爲所有應用程序提供查詢。

在這種情況下,RootView也必須提供查詢,並將selected密鑰傳遞給MainMenu組件。

(def app-data 
    (atom {:user "" 
     :menu {:selected :home}})) 

(defui RootView 
    static om/IQuery 
    (query [this] 
    `[{:menu (om/get-query MainMenu)}]) 
    Object 
    (render [this] 
    (let [{:keys [menu]} (om/props this)] 
     (println "Render RootView") 
     (main-menu menu)))) 

而且,閱讀器功能分派的:menu關鍵,而不是:selected關鍵。

(defmethod read :menu 
    [{:keys [state]} _ _] 
    {:value (get-in @state [:menu])}) 

其餘代碼保持不變。

1

om.next中,正如您發現的那樣,所有查詢都必須組成根組件。根組件根據read函數在處理根查詢時返回的內容爲其分配props

如果有任何子組件有查詢,則該查詢所請求的道具應作爲第一個參數傳遞給子組件的工廠方法。這是你錯過的第二件作品。

如果您在子組件中查詢最終沒有被父組件傳回的內容,Om中目前沒有任何警告或錯誤。所以如果你忘記傳遞道具,你最終會解構子組件中的鑰匙的nil值。