Ich habe Probleme bekommen eine zweite Ebene zu verbinden, um richtig zu arbeiten. Ich habe einige Dinge hier aus Gründen der Breathness weggelassen.Om Nächste lesen Multi-Fn nicht in der zweiten Ebene Join aufgerufen, Abfrage AST nicht vollständig geparst, daher Komponente nur Empfangen von IDs
Meine Stammkomponente ist:
(defui RootView
static om/IQuery
(query [this]
`[{:list/events ~(om/get-query Event)}])
Object
(render [this]
(let [{:keys [list/events]} (om/props this)]
(events/event-list events))))
Meine Abfragen komponieren korrekt und die Anfangsdaten richtig normalisiert. Ich werde die normalisierten Daten nicht anzeigen, und die gesamte Abfrage enthält mehr.
(prn (om/get-query RootView)) =>
[{:list/events
[:id
{:body [:id :text :headline]}
{:media [:id :url :caption :credit]}
{:start-date [:id :year :month :day]}]}]
Wenn ich eine Abfrage enthält, die Verbindungen durch einen Parser laufen erhalte ich:
(prn (parser {:state (atom norm-data)}
'[{:list/events
[:id
{:body [:id :text :headline]}
{:media [:id :url :caption :credit]}
{:start-date [:id :year :month :day]}]}])) =>
{:list/events
[{:id 1,
:media [:media/by-id 1],
:start-date [:start-date/by-id 1],
:body [:body/by-id 1]}
{:id 17,
:media [:media/by-id 17],
:start-date [:start-date/by-id 17],
:body [:body/by-id 17]}]}
So ist die Lesefunktion für: Liste/wird Ereignisse aufgerufen und gibt seine Daten, wenn alle der zweite schließt sich für : body,: media und: start-date sind nicht.
Meine Lesefunktionen sind wie folgt, die zweite ist die, die nicht aufgerufen wird. Ich habe die Multimethoden auf: Medien und: Start-Datum, sie werden auch nicht aufgerufen. Ich bin mir nicht sicher, was das für ein Symptom ist.
(defmulti read om/dispatch)
(defmethod read :list/events
[{:keys [state] :as env} key params]
(let [st @state]
{:value (into [] (map #(get-in st %)) (get st key))}))
(defmethod read :body
[{:keys [state query]} key _]
(println "This is never printed")
{:value :doesnt-matter})
Die Verbindung korrekt in dem AST identifiziert wird (so gehe ich davon aus der Abfrage Grammatik korrekt ist) und der Versand Schlüssel übereinstimmt, dass die Multi-Methode.
(prn (om/query->ast (om/get-query RootView))) =>
{:type :root,
:children
[{:type :join,
:dispatch-key :list/events,
:key :list/events,
:query
[:id
{:body [:id :text :headline]}
{:media [:id :url :caption :credit]}
{:start-date [:id :year :month :day]}],
:component timeline.components.events/Event,
:children
[{:type :prop, :dispatch-key :id, :key :id}
{:type :join,
:dispatch-key :body,
:key :body,
:query [:id :text :headline],
:component timeline.components.events/EventBody,
:children
[{:type :prop, :dispatch-key :id, :key :id}
{:type :prop, :dispatch-key :text, :key :text}
{:type :prop, :dispatch-key :headline, :key :headline}]}]}]}
Ich kann nicht verstehen, warum der Parser oder etwas (?) Bei der zweiten Join stoppt? Soweit mein begrenztes Verständnis geht, sollte die Multi-Methode on: body zumindest aufgerufen werden?
Mein Missverständnis war, wo die Rekursion passiert ist. Mein Gedanke war, dass der Parser auf den Join der zweiten Ebene stoßen und nach der relevanten Multi-Methode suchen würde, weshalb ich eine Multi-Methode für ': body' hatte. Also gegeben, was Sie sagen, Sie haben nur Multi-Methoden "lesen" für jede Top-Level-Taste, richtig? –
Mein Verständnis ist, dass für die Schlüssel ganz unten brauchen Sie keine Lese-Methoden, aber für alle Ebenen höher Sie tun. In der Realität ist es nicht so schwierig, weil Sie eine Fehlermeldung erhalten und eine andere einlegen! –
Ich verstehe das Standard-DB-Format und kann mit den zusammengesetzten 'IQuery'- und' Ident'-statischen Methoden korrekt de-normalisierte Daten in es hinein bekommen. Ich verstehe jetzt, dass ich den rekursiven Join innerhalb der "read" Multi-Methode der obersten Ebene machen muss und dass der Parser keine weiteren Multi-Methoden aufrufen wird. Angesichts dessen scheint es mir, dass Sie dann nur Lese-Multi-Methoden der obersten Ebene benötigen. Ich verstehe es also nicht, wenn du sagst "aber für alle höheren Stufen, die du tust". Es ist Zeit, die Quelle zu lesen, denke ich, hah! –