我有一个带有文本编辑器的seesaw 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 %)))选中任务是引用编辑器当前内容模型的原子。每当用户编辑文本更新任务!函数应该被调用。但什么都没发生。这个函数似乎根本没有被调用。当我从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线程和原子在其中定义的线程之间是否存在冲突?
发布于 2012-04-06 17:01:37
在这种情况下,它在简单的情况下工作,在更复杂的情况下停止,我猜想会出现异常,可能是在assoc或replace中的let绑定中。根据开发环境的不同,异常可能是隐藏的,因为它发生在UI线程上。
我建议尝试调用seesaw.dev/debug!,它将在ui线程中抛出未处理的异常时弹出带有堆栈跟踪的UI。
https://stackoverflow.com/questions/10044969
复制相似问题