2016-12-19 4 views
0

Ich weiß, dass Clojure dreht sich um unveränderliche Daten. Wenn Sie also ein Atom haben (sagen wir mit dem Wert 0), besteht die Möglichkeit, den Wert zu ändern, darin, das Atom zu de-referenzieren und Swap zu verwenden! oder zurücksetzen! (Sagen wir jetzt mit Wert 1). Allerdings hat das Atom global immer noch den Wert 0 und im spezifischen Reset! oder tauschen! Funktion hat es Wert 1. (Ich glaube, das ist richtig). Meine Frage ist, kann ich eine andere Funktion haben, die den Wert des Atoms ändert, die an 1.Clojure - Ändern des Werts eines Atoms in einer anderen Funktion

Mehr ist klar

(def table-data {:headers ["RIC-Code" "Isin" "Currency" "Description"] 
       :rows []}) 

(defonce fields (atom {})) 
(defonce errors (atom nil)) 
(defonce isin (atom "test") 
(defonce tdata (atom table-data)) 


(defn get-ric [ric isin] 
    (GET "/search-isin" 
     {:params {:ric ric} 
     :headers {"Accept" "application/transit+json"} 
     :handler #(do 
        (.log js/console (str "get-msg response : " %)) 
        (reset! isin %) 
        (reset! tdata {:headers ["RIC-Code" "Isin" "Currency" "Description"] 
            :rows @isin}))})) 



(defn replace-value [struct] 
    (walk/prewalk-replace {"id" "name"} struct)) 
(defn isin-form2 [isin] 
    [:div.content 
    [errors-component errors :server-error] 
    [:div.form-group 
    [errors-component errors :name] 
    [:p "Enter RIC-Code:" 
    [:input.form-control 
     {:type  :text 
     :name  :ric 
     :on-change #(swap! fields assoc :ric (-> % .-target .-value)) 
     :value  (:ric @fields)}]] 
    [errors-component errors :message] 
    [:input.btn.btn-primary 
    {:type  :submit 
     :on-click #(do 
        (get-ric (:ric @fields) isin)) 
     :value "Search RIC-Code"}] 
    [rt/reagent-table tdata] 
    [:input.btn.btn-primary 
    {:type  :submit 
     :on-click #(do 
        (reset! tdata {:headers ["RIC-Code" "Isin" "Currency" "Description"] 
           :rows (swap! isin (replace-value %))})) 
     :value "Change"}]]]) 

Was die oben genannten Code tut, ist in isin-form2, dauert es eine anfängliche Wert und setzt in Felder mit Schlüsselwort ric. Die erste Schaltfläche ruft die Funktion get-ric auf und gibt tdata zurück. (In get-ric ist das Isin ein Atom, das ein Vektorenvektor ist, dh [["id" ...] [...] ... [...]]) Was ich will, ist der zweite Knopf Tauschen Sie die Wert-ID für name mit replace-value. Aber in der zweiten Taste, wenn ich versuche zu tauschen! der wert der isin es ändert nicht

Antwort

0

Vielleicht wird erklärt, wie es funktioniert:

(def my-state (atom 0)) 

(defn fn1 [] 
    (newline) 
    (println :fn1-enter @my-state) 
    (swap! my-state inc) 
    (println :fn1-exit @my-state) 
    (newline)) 

(defn fn2 [] 
    (newline) 
    (println :fn2-enter @my-state) 
    (swap! my-state inc) 
    (println :fn2-exit @my-state) 
    (newline)) 

(println :main-1 @my-state) 
(fn1) 
(println :main-2 @my-state) 
(fn2) 
(println :main-3 @my-state) 

mit

:main-1 0 

:fn1-enter 0 
:fn1-exit 1 

:main-2 1 

:fn2-enter 1 
:fn2-exit 2 

:main-3 2 
0

Sie geben swap! eine Funktion nicht. Versuchen:

(swap! isin #(replace-value %))

Verwandte Themen