2012-04-06 110 views
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線程和原子定義的線程之間可能存在衝突嗎?

回答

5

在這樣的地方工作在簡單的情況下,停止在更復雜的情況下的情況下,我猜想,有一個例外發生,可能在let綁定assocreplace。根據您的開發環境,異常可能會隱藏,因爲它發生在UI線程上。

我建議嘗試調用seesaw.dev/debug!,每次在UI線程中引發未處理的異常時,它將彈出一個帶有堆棧跟蹤的ui。

+0

非常感謝!你是對的。設置調試顯示我犯了一個愚蠢的錯誤。試圖訪問我應該訪問它的值的原子。 – nansen 2012-04-06 17:50:43