我有一个带文本编辑器的跷跷板ui。编辑器内容由名为“Task”的记录支持,该记录包含在名为“state”的原子中。编辑器上的密钥释放事件应该更改属性:任务的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线程与原子定义的线程之间是否存在冲突?
答案 0 :(得分:5)
在这样的情况下,它在简单的情况下起作用并在更复杂的情况下停止,我猜测会发生异常,可能在assoc
或replace
中let
1}}绑定。根据您的开发环境,异常可能会隐藏,因为它发生在UI线程上。
我建议尝试调用seesaw.dev/debug!
,只要在UI线程中抛出未处理的异常,它就会弹出一个带有堆栈跟踪的UI。