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 ....)))
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.
(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 ....)))
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
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