我有一个带有文本编辑器的跷跷板用户界面。编辑器内容由称为“任务”的记录支持,该记录包含在称为“状态”的原子中的某处。编辑器上的键释放事件应更改任务的属性 :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线程和定义原子的线程之间是否存在冲突?