Ich habe eine Wippe mit einem Texteditor. Der Inhalt des Editors wird von einem Datensatz namens "Task" unterstützt, der irgendwo in einem Atom namens "state" enthalten ist. Ein vom Schlüssel freigegebenes Ereignis im Editor sollte die Eigenschaft: desc des Tasks ändern. Ich verwende den folgenden Code ein:Zugriff auf Atom oder Aktualisierung von Atom innerhalb einer Wippe Listener-Funktion
(def state
(atom {:tasks []
:interval nil
:style (style :foreground :black :background nil)}))
(defn on-text-edited [ui listener-fn]
(let [editor (select ui [:#editor])]
(listen editor :key-released
(fn [evt] (listener-fn (text editor))))))
(defn update-task! [task text]
(let [newtask (assoc task :desc text)
tasks (replace {task newtask} (:tasks @state))]
(swap! state
#(assoc % :tasks tasks))))
(def text-updates (on-text-edited frame #(update-task! selected-task %)))
ausgewählt Aufgabe ein Atom ist das aktuelle Inhaltsmodell des Editors verweist. Immer wenn der Benutzer den Text bearbeitet, wird die Update-Aufgabe! Funktion soll aufgerufen werden. Aber nichts passiert. Die Funktion scheint überhaupt nicht aufgerufen zu werden. Wenn ich es vom repl anrufe, verhält es sich wie erwartet.
ich getestet, ob die Funktion würde, indem man es eine einfache println tun aufgerufen:
(defn update-task! [task text]
(println (str task " " text)))
Nun wird die Funktion funktioniert gut, wenn ich Text im Editor bearbeiten. Dann änderte ich es zu:
(defn update-task! [task text]
(let [newtask (assoc task :desc text)
tasks (replace {task newtask} (:tasks @state))]
(println (str task " " text))))
jetzt wieder würde es gar nichts tun. Es scheint also, dass der Zugriff auf die Atome der Ereignisbehandlung irgendwie im Wege steht. Gibt es möglicherweise einen Konflikt zwischen dem ui-Thread und dem Thread, in dem die Atome definiert wurden?
Vielen Dank! Du hattest Recht. Das Debugging hat ergeben, dass ich einen dummen Fehler gemacht habe. Versucht, auf ein Atom zuzugreifen, wo ich stattdessen auf seinen Wert hätte zugreifen sollen. – nansen