Hi Axel,

First, as somebody else pointed out, om is a little bit young to have 
definitive "right and wrong" answers, so it is even more important to 
understand the context of those answers.

So, in the context of relative newbie myself :), I am not entirely clear what 
the problem is. Can you clarify please.

Are you saying that app-state has {:model-objects [...]} and when added to 
leaflet, leaflet generates a corresponding leafletModelObject? If so, is your 
question "how do I update the corresponding leafletModelObject when its 
"linked" om model-object changes?

If so, this is where it gets a bit edgy. I find om is great when the whole UI 
is a projection of app-state. No need to track the lifecycle of how app-state 
evolved, it is just a pure function of the current om state. Here you want to 
break that paradigm and start tracking how data has evolved. I think that is 
fine and valid, but is a little bit more complicated.

Assuming I am on the right track the ideal answer is recreate the 
leafletModelObject every time the om model changes, moving back to the "UI is 
only a projection of state" pattern. To do this I would suggest the (render) 
function of the leaflet container is a good place as that is only called when 
the input to render changes.

If that isn't possible or too expensive then you can will need to manually sync 
them, again, (render) seems a good place. You would end up with pseudo code 
like:

(render [{:keys [model-objects] :as cursor} owner]
  (let [leaflet ...
        leaflet-models (get-the-models-from leaflet)
        updated-leaflet-models (sync model-objects leaflet-models)]
    (update-leaflet-models leaflet updated-leaflet-models)
    (om/build leaflet-etc)))

"sync" could either check timestamps, recreate the leaflet-model and check for 
differences etc, check a version, model-object could cache the leaflet-model 
and do an equality check etc.

However, as I say, I am making many assumptions about your usecase. To repeat, 
the world becomes a much simpler place if your render function doesn't care 
about time, it doesn't distinguish between creation and editing, it simply gets 
the app-state and renders it (i.e. it recreates the leaflet object every time). 
If like me your initial reaction was "wow, that is going to be really slow", 
turns it JavaScript is much quicker than we realise (except IE<9!). Give it a 
go and prove it is too slow.

Hope that ramble helps :).





On Monday, 12 January 2015 09:20:30 UTC, Axel Katerbau  wrote:
> Hi!
> 
> I'm relative new to Clojurescript and om and have a question regarding the 
> use of libraries that "produce" state in the context of an om app.
> 
> The app uses the nice leaflet library to display a map. So far so good, but 
> it should also display markers for corresponding model objects (properly 
> residing in an app-state atom). Adding markers creates marker objects that 
> better be stored somewhere so they can be updated when the model changes. 
> 
> My (newbie) question is: What is the best (tm) idea for updating and storing 
> these marker objects?
> 
> - Axel

-- 
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