It was suggested that all state changes to the Om atom should occur within an Om component. Currently I am swap!ing outside Om.
A lot of my state changes are the result of an infinite <! loop inside a go block, which is reading a websocket. What happens if I put this inside an Om component, and where is the best place to do so? IWillMount?
Since the block is asynchronous, couldn't the Om protocol (whichever one is best) return before the go block actually does anything? Or what happens when the go block does something at a different time than the Om protocol is getting called?
Or perhaps more likely there is a better way. Any suggestions on good approach here are appreciated.
--
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 clojurescrip...@googlegroups.com.
To post to this group, send email to clojur...@googlegroups.com.
Visit this group at http://groups.google.com/group/clojurescript.
I put up a small thing to take a look at mounting and unmounting. It is up here. https://github.com/Will-Sommers/mount-unmount-test
Your intuition is correct. When a parent component decides not to previously mounted child component then it is unmounted. I also put up a small example where a parent component attempts to build a child component when no data is available to see if will-unmount is called. After looking at the dom it is obvious that the component is still rendered but without the data and therefore does not unmount.
Take a look.
Your approach is very similar to what I'm currently doing. I have an invisible root component that manages pushing external changes to the state. I also use tx-listen to do the opposite: push om-initiated changes to the server (similar to om-sync).
Actually in hindsight the draining wouldn't be necessary inside an
infinite go loop such as a while-true inside the Om component.
On Tue, Jul 8, 2014 at 11:23 PM, Andrew Stoeckley <andr...@gmail.com> wrote:
> I'd be curious what you all think of this strategy for using a channel
> for updating the Om atom inside a component. I have several different
> places in the app that need to notify Om of new data. It can come from
> anywhere based on a variety of things, so I've just created a single
> channel, and onto this channel is placed a vector of args like [cursor
> korks v] for passing to om/transact!. When I read this channel in a go
> block inside an Om root component, the vector is pulled off and an
> (apply om/transact! [cursor korks v]) is processed for whatever was
> put on the vector. This allows a single entry point to the actual
> updating of the Om atom via the proper transact! while still letting
> any area of the app dump state changes onto the channel.
>
> I'm still coding up everything, and of course one of the obvious
> issues is that many items may be placed on the channel before the next
> read (though unlikely), thus it becomes necessary in the go block to
> drain the entire channel and use up all its values at once so all
> pending updates are processed, for which I'm using a more meaningful
> variation of this go-loop-alt approach:
> https://gist.github.com/hellofunk/b32c8e0d267ada0cc396
>
> As I'm new to both Om and core.async, I'd enjoy hearing any obvious
> alternatives to this approach or just a vote of confidence that it's a
> decent idea.