diff --git a/docs/FAQs/UseASubscriptionInAnEventHandler.md b/docs/FAQs/UseASubscriptionInAnEventHandler.md index 98abe9b..e9a965b 100644 --- a/docs/FAQs/UseASubscriptionInAnEventHandler.md +++ b/docs/FAQs/UseASubscriptionInAnEventHandler.md @@ -1,6 +1,6 @@ ### Question -How do I access the value of a subscription from within an event handler? +How do I access the value of a subscription from within an event handler? ### The Wrong Way @@ -10,19 +10,19 @@ You should NOT do this: :event-id (fn [db v] (let [sub-val @(subscribe [:something])] ;; <--- Eeek - ....))) + ....))) ``` -If you do: -1. You might create a memory leak (the subscription might not be "freed") -2. You have just made you event handler impure (it reaches out and grabs a global value). - +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, to make the value of a subscription available within an event handler, it has to +Instead, the value of a subscription should be injected into the `coeffects` of that handler via an interceptor. -The overall sketch is: +A sketch: ```clj (re-frame.core/reg-event-fx ;; handler must access coeffects, so use -fx :event-id @@ -32,11 +32,17 @@ The overall sketch is: ....))) ``` +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 interceptor? + ### Solutions -re-frame doesn't yet have a built in interceptor to do this injection. +re-frame doesn't yet have a builtin `inject-sub` interceptor to do this injection. -So you'll need to create your own or you may want to use this 3rd party library: +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