好吧,我想通了。
init-data
是不正確的數據結構來調用get-people
與。初始數據必須首先使用Om的reconciler
進行「調和」。您可以在本教程的Normalization部分中找到關於調節器的更多信息。
調和init-data
地圖,然後deref
荷蘭國際集團的數據返回該歸一化的數據結構:
{:list/one
[[:person/by-name "John"]
[:person/by-name "Mary"]
[:person/by-name "Bob"]],
:list/two
[[:person/by-name "Mary"]
[:person/by-name "Gwen"]
[:person/by-name "Jeff"]],
:person/by-name
{"John" {:name "John", :points 0},
"Mary" {:name "Mary", :points 0, :age 27},
"Bob" {:name "Bob", :points 0},
"Gwen" {:name "Gwen", :points 0},
"Jeff" {:name "Jeff", :points 0}}}
下面是使用調和INIT-數據到get-people
功能有效的呼叫:
; reconciled initial data
(def reconciled-data
{:list/one
[[:person/by-name "John"]
[:person/by-name "Mary"]
[:person/by-name "Bob"]],
:list/two
[[:person/by-name "Mary"]
[:person/by-name "Gwen"]
[:person/by-name "Jeff"]],
:person/by-name
{"John" {:name "John", :points 0},
"Mary" {:name "Mary", :points 0, :age 27},
"Bob" {:name "Bob", :points 0},
"Gwen" {:name "Gwen", :points 0},
"Jeff" {:name "Jeff", :points 0}}}
; correct function call
(get-people (atom reconciled-data) :list/one)
; returned results
[{:name "John", :points 0}
{:name "Mary", :points 0, :age 27}
{:name "Bob", :points 0}]
以下是發生了什麼事情:
- Fi首先,該函數檢索與
:list/one
鍵相關的值。在這種情況下,該值是到地圖中的路徑矢量(每個路徑本身就是一個矢量)。
- 接下來,映射路徑並調用每個向量上的匿名函數。其中一個呼叫看起來像
(get-in st [:person/by-name "John"])
,並返回{:name "John", :points 0}
。
- 返回的結果作爲載體
若有人讀這篇文章,希望進一步澄清,請讓我知道。