私は再フレームが大好きですが、AJAXレスポンスを処理するための素敵なパターンを見つけるのに少し苦労しています。Clojureの再フレームでAJAXの成功/エラー応答を処理する方法は?
私の状況は以下の通りです:
私は例えば、その呼び出しが成功したかどうかに応じて、いくつかの他のグローバルイベントハンドラにいくつかのAJAX呼び出しとディスパッチをトリガーする「グローバル」イベントハンドラを持っている:
(reg-event-db :store-value
(fn [db [_ value]]
(do-ajax-store value
:on-success #(dispatch [:store-value-success %])
:on-error #(dispatch [:store-value-error %])
db))
(reg-event-db :store-value-success
(fn [db [_ result]]
(assoc db :foobar result)))
(reg-event-db :store-value-error
(fn [db [_ error]]
(assoc db :foobar nil
:last-error error)))
(私はreg-event-fx
を知っています。簡潔さのために、私はここでそれを避けています、そして、それは私の問題のために何の違いもないと思うからです)。
のでように私はまた、:store-value
イベントをトリガする可能性がある(複数の異なる)UIコンポーネントを有する:
(defn button []
(let [processing? (reagent/atom false)]
(fn button-render []
[:button {:class (when @processing? "processing")
:on-click (fn []
(reset! processing? true)
(dispatch [:store-value 123]))}])))
はしたがって、この場合にコンポーネントかどうかに依存するようになっているローカル状態(processing?
)を有していますAJAXコールはまだ進行中であるかどうかはわかりません。
さて、適切なパターンは、AJAX呼び出しが完了した後にfalse
に戻っprocessing?
フラグをリセットするためにイベント:store-value-success
と:store-value-error
に反応をbutton
成分を持つためにここ何ですか?
現在、私はコールバックを渡すことでこの問題を回避していますが、実際にそこに属していないものでイベントハンドラのコードを混乱させるため、実際には醜いようです。私が考えてきた
最善の解決策は、このように、button
コンポーネントは:store-value-success
と:store-value-error
イベントをフックし、それらのイベントのために、独自のハンドラをインストールすることができるという持っているだろう:
(defn button []
(let [processing? (reagent/atom false)]
(reg-event-db :store-value-success
(fn [db _]
(reset! processing? false)))
(reg-event-db :store-value-error
(fn [db _]
(reset! processing? false)))
(fn button-render []
[:button {:class (when @processing? "processing")
:on-click (fn []
(reset! processing? true)
(dispatch [:store-value 123]))}])))
しかし、 、それは動作しません。再フレームはイベントごとに複数のイベントハンドラを許可しません。代わりに、1つの単一のイベントIDでreg-event-db
を後で呼び出すと、前のイベントハンドラーが置き換えられます。
こういう状況にどうやって対処していますか?
また、https://github.com/Day8/re-frame-http-fx –
をご覧ください。ありがとうございます、私はそれを認識しています。しかし、私はその問題をどのように解決するのか分かりません。何か不足していますか? – Oliver
いいえ、ちょうどそれをあなたの注意に持っていきたいと思っていました。 :) –