I would have reagent.ratom/run! dispatch events when app-db needs to be
modified and handlers would do the modification as usual.

I originally thought about the on-changes middleware, but that has the
shortcoming that it isn't triggered when app-db changes unless the handler
doing the changing explicitly includes the middleware, which IMHO leaks
concerns all over the place (you now have to remember to add the middleware
anywhere that might cause changes you want to react to; makes generic
reusable components hard too).

On Sun, 24 May 2015 at 19:29 Mike Thompson <[email protected]>
wrote:

> On Monday, May 25, 2015 at 12:13:53 AM UTC+10, Colin Yates wrote:
> > I am finding more and more use-cases for doing something when data
> changes that aren't necessarily to do with a UI component.
> >
> > Ideally I want to do something like (outside any GUI):
> >
> > (defn my-controller-for-concern-x
> >   (let [source (subscribe [:....])]
> >     (do-something-when-this-changes @source)))
> >
> > and that (do-something-when-this-changes) be called whenever @source
> changes.
> >
> > But that feels dangerous and a possible memory leak. Am I being overly
> cautious/is there a better way?
>
>
> Only event handlers can change app-db, so the most natural way to achieve
> this is via middleware.
>
> For example, here is middleware that watches multiple parts of app-db for
> changes and then does "something" (modifies another part of ap-db):
>
> https://github.com/Day8/re-frame/blob/b921fa497d169d7473c1b0124679f68f6c380208/src/re_frame/middleware.cljs#L182-L218
>
> Your "something" will obliviously be different. If you use this method,
> then you do have to add this middleware to the right event handlers.
>
> In some cases, I can see how it would be convenient to just attach a
> single "watcher", in which case this safe (no memory leak):
>
> (let [source (subscribe [:....])]
>    (reaction (something! @source)))
>
> Note: I took out the wrapping function definition you had -- I was a bit
> puzzled about the purpose of that -- perhaps I misunderstood.  I assume you
> just want to setup a single watcher. And I'm guessing the something! must
> be side-effecting.
>
> --
> Mike
>
>
>
> --
> Note that posts from new members are moderated - please be patient with
> your first post.
> ---
> You received this message because you are subscribed to the Google Groups
> "ClojureScript" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/clojurescript.
>

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/clojurescript.

Reply via email to