我有一个带文本编辑器的跷跷板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 %)))
Run Code Online (Sandbox Code Playgroud)
selected-task是一个引用编辑器当前内容模型的atom.每当用户编辑更新任务的文本时!函数应该被调用.但没有任何反应.该函数似乎根本没有被调用.当我从repl调用它时,它的行为与预期一致.
我测试了函数是否会通过让它执行一个简单的println来调用它:
(defn update-task! [task text]
(println (str task " " text)))
Run Code Online (Sandbox Code Playgroud)
现在,当我在编辑器中编辑文本时,该功能正常工作.然后我把它改为:
(defn update-task! [task text]
(let [newtask (assoc task :desc text)
tasks (replace {task newtask} (:tasks @state))]
(println (str task " " text))))
Run Code Online (Sandbox Code Playgroud)
再说一遍,它什么都不做.所以似乎不知何故原子的访问妨碍了事件处理.ui线程与原子定义的线程之间是否存在冲突?
在这样的地方工作在简单的情况下,停止在更复杂的情况下的情况下,我猜,在有发生异常,可能assoc还是replace在let绑定.根据您的开发环境,异常可能会隐藏,因为它发生在UI线程上.
我建议尝试调用seesaw.dev/debug!哪个会在UI线程中抛出未处理的异常时弹出带有堆栈跟踪的ui.
| 归档时间: |
|
| 查看次数: |
269 次 |
| 最近记录: |