¶
Question¶
How do I access the value of a subscription from within an event handler?
The Wrong Way¶
You should NOT do this:
(re-frame.core/reg-event-db
:event-id
(fn [db v]
(let [sub-val @(subscribe [:something])] ;; <--- Eeek
....)))
because that subscribe
:
1. might create a memory leak (the subscription might not be "freed")
2. makes the event handler impure (it grabs a global value)
The Better Way¶
Instead, the value of a subscription should
be injected into the coeffects
of that handler via an interceptor.
A sketch:
(re-frame.core/reg-event-fx ;; handler must access coeffects, so use -fx
:event-id
(inject-sub [:query-id :param]) ;; <-- interceptor will inject subscription value into coeffects
(fn [coeffects event]
(let [sub-val (:something coeffects)] ;; obtain subscription value
....)))
Notes:
1. inject-sub
is an interceptor which will get the subscription value and add it to coeffects (somehow)
2. The event handler obtains the value from coeffects
So, how to write this inject-sub
interceptor?
Solutions¶
re-frame doesn't yet have a builtin inject-sub
interceptor to do this injection.
I'd suggest you use this 3rd party library: <https://github.com/vimsical/re-frame-utils/blob/master/src/vimsical/re_frame/cofx/inject.cljc>