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.
