1

テキストエディタ付きのシーソーUIがあります。エディターのコンテンツは、「state」というアトムのどこかに含まれている「Task」というレコードによって支えられています。エディターでキーがリリースされたイベントは、タスクのプロパティ: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 %)))

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スレッドとアトムが定義されたスレッドの間に競合がある可能性がありますか?

4

1 に答える 1

5

assocこのような単純なケースで機能し、より複雑なケースで停止する場合、おそらくバインディング内またはバインディングreplace内で例外が発生していると思いletます。開発環境によっては、UIスレッドで発生するため、例外が非表示になる場合があります。

seesaw.dev/debug!UIスレッドで未処理の例外がスローされるたびに、スタックトレースを使用してUIをポップアップする呼び出しを試してみることをお勧めします。

于 2012-04-06T17:01:37.993 に答える