2016-11-27 3 views
0

Ich habe Probleme mit der Aktualisierung des Status mit Daten aus Eingabefeldern in Om.next.Aktualisierung des geschachtelten Status in Om.next

Der Lesezustand in Om.next wird durch Abfragen und Abfragen gelöst, die es Komponenten ermöglichen, den Abrufzustand unabhängig vom Kontext zu implementieren, was großartig ist, da die Komponente die Struktur des Zustandsatoms nicht kennen muss muss den lokalen Ausschnitt des Staatsatoms verstehen, der direkt zu ihm gehört.

Leider war ich nicht in der Lage, einen Weg zu finden, dies in die entgegengesetzte Richtung zu tun, dh Mutationszustand basierend auf Benutzerinteraktion mit Komponenten in einer Weise, die es nicht mit der Position der Komponente im Zustandsatom koppelt .

Die meisten Beispiele im Internet haben mutate-Funktionen, die einen bestimmten Pfad im Statusatom ändern, beginnend mit dem Root.

(defonce app-state (atom {:badge {:credentials {:user "" :password ""}}})) 

So, jetzt gehe ich um die Komponente zu machen:

Object 
(render [this] 
(dom/div nil 
     (dom/input #js {:onChange ??? 
         :value {:user value}}) 
     (dom/input #js {:onChange ???? 
         :value {:password value}}))) 

Es ist ein ziemlich krasses Beispiel, aber wie aktualisiere ich den Zustand, wenn Benutzertypen, ohne die Tatsache zu koppeln, dass es unter dem Pfad gespeichert werden ?

Die Lesevorgänge werden von der Abfrage erfasst, die Mutationen jedoch nicht. Dies ist ein einfaches künstliches Beispiel, aber es wird schlimmer, wenn ich versuche, einen verschachtelten Baum mit (zur Codierungszeit) unbekannter Form zu rendern und zu aktualisieren.

Antwort

0

Ihre :onChange einem Ihrer Mutationen berufen könnten:

:onChange (fn [_] (om/transact! this `[(app/set-name { :person 1 :name ~n })])) 

Neben den Parametern und den Ort, wo die Mutation aus aufgerufen wird, gibt es keine Kopplung - die Mutation ist nichts anderes als ein Name - hier app/set-name . Natürlich muss die Mutation implementiert werden. Hier ist sie:

(defmethod m/mutate 'app/set-name 
    [{:keys [state] :as env} key {:keys [person name] :as params}] 
    {:action (fn [] 
    (swap! state update-in [:people/by-id person] assoc :person/name name))}) 

Der Code Mutation selbst mit normalisierten app-Zustand zu tun wird, was bedeutet, dass die strukturelle Form der Daten ist kein Baum.

Dieses Beispiel stammt aus: http://localhost:3449/#!/untangled_devguide.G_Mutation

Verwandte Themen