首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从seesaw侦听器函数中访问或更新atom。

无法从seesaw侦听器函数中访问或更新atom。
EN

Stack Overflow用户
提问于 2012-04-06 14:35:54
回答 1查看 278关注 0票数 1

我有一个带有文本编辑器的seesaw ui。编辑器内容由一个名为“Task”的记录支持,该记录包含在一个名为“state”的原子中。编辑器上释放的键事件应该更改任务的属性:desc。我使用以下代码:

代码语言:javascript
复制
(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来测试函数是否会被调用:

代码语言:javascript
复制
(defn update-task! [task text]
   (println (str task " " text)))

现在,当我在编辑器中编辑文本时,这个函数工作得很好。然后我把它改成:

代码语言:javascript
复制
(defn update-task! [task text]
  (let [newtask (assoc task :desc text)
        tasks (replace {task newtask} (:tasks @state))]
     (println (str task " " text))))

现在又一次,它将一事无成。因此,似乎原子的访问在某种程度上阻碍了事件的处理。ui线程和原子在其中定义的线程之间是否存在冲突?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-06 17:01:37

在这种情况下,它在简单的情况下工作,在更复杂的情况下停止,我猜想会出现异常,可能是在assocreplace中的let绑定中。根据开发环境的不同,异常可能是隐藏的,因为它发生在UI线程上。

我建议尝试调用seesaw.dev/debug!,它将在ui线程中抛出未处理的异常时弹出带有堆栈跟踪的UI。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10044969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档