1
我有一個帶有文本編輯器的蹺蹺板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線程和原子定義的線程之間可能存在衝突嗎?
非常感謝!你是對的。設置調試顯示我犯了一個愚蠢的錯誤。試圖訪問我應該訪問它的值的原子。 – nansen 2012-04-06 17:50:43