2012-04-06 2 views
1

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?

Antwort

5

In einem Fall wie diesen, wo es im einfachen Fall funktioniert und hält in einem komplexeren Fall, ich würde vermuten, dass eine Ausnahme gibt es vorkommen, wahrscheinlich in assoc oder replace in den let Bindungen. Abhängig von Ihrer Entwicklungsumgebung kann die Ausnahme verborgen sein, da sie im UI-Thread auftritt.

Ich würde vorschlagen, versuchen Sie Aufruf seesaw.dev/debug!, die ein ui mit einem Stapel-Trace immer wenn eine nicht behandelte Ausnahme im UI-Thread ausgelöst wird.

+0

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