テキストエディタ付きのシーソーUIがあります。エディターのコンテンツは、「state」というアトムのどこかに含まれている「Task」というレコードによって支えられています。エディターでキーがリリースされたイベントは、タスクのプロパティ:descを変更する必要があります。私は次のコードを使用します:
(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 %)))
selected-taskは、エディターの現在のコンテンツモデルを参照するアトムです。ユーザーがテキストを編集するときはいつでも、更新タスク!関数が呼び出されることになっています。しかし、何も起こりません。関数はまったく呼び出されていないようです。replから呼び出すと、期待どおりに動作します。
単純なprintlnを実行させることで、関数が呼び出されるかどうかをテストしました。
(defn update-task! [task text]
(println (str task " " text)))
これで、エディターでテキストを編集するときに関数が正常に機能するようになりました。それから私はそれを次のように変更しました:
(defn update-task! [task text]
(let [newtask (assoc task :desc text)
tasks (replace {task newtask} (:tasks @state))]
(println (str task " " text))))
繰り返しになりますが、何もしません。したがって、どういうわけか、アトムへのアクセスがイベント処理の邪魔になるようです。UIスレッドとアトムが定義されたスレッドの間に競合がある可能性がありますか?