Does it make any sense to allow components to reference multiple cursors? Instead of specifying a single path into the application state, you would specify a collection of paths within the state atom, all of which would trigger re-renders and allow for transact! and update!? I often find myself pulling component cursor paths 'up' the tree in order to ensure that the cursor is broad enough to capture all of the state changes that might cause a re-render.
That being said, I still have the feeling that in the majority of cases, the confined scope of the cursor guides me towards a more sensible layout of the application state. On Thursday, April 10, 2014 4:12:31 AM UTC+2, David Nolen wrote: > Yes it's a problem that you encounter in React if you try to do things in a > functional manner. It's not really a "limitation" of React or Om. But at > least in the case of Om I consider it a deficiency great enough to build > direct support so that users aren't hampered by it or forced to come up with > their own ad-hoc solutions. > > > > David > > > > On Wed, Apr 9, 2014 at 10:05 PM, Brendan Stromberger <[email protected]> > wrote: > > I've encountered this issue in vanilla React (js), and couldn't figure out > any other way than munging my data together such that I could pass it down in > the way OP describes. I guess my question is, is this limitation inherent in > React or in the Om abstraction? > > > > > > On Wednesday, April 9, 2014 3:52:05 AM UTC-7, David Nolen wrote: > > > You're not missing anything. This is a fundamental issue in Om right now > > and I've been designing and working on a fix. Basically in the very near > > future a component will be able to access something in the application > > state without needing a parent component to pass it in from above. > > > > > > > > > > > > > The idea is that a component will be able to get its data directly from the > > app state with something like (om/get-shared owner [:app-state :foo]). > > > > > > > > > Still working out the details, but this work is happening in the > > `ind-components` branch. When it's finished there'll be an accompanying > > nested tab view example - one of the cases that suffers the most under the > > current system. > > > > > > > > > > > > > > > > David > > > > > > > > > > > > > On Wed, Apr 9, 2014 at 6:33 AM, Daniel Kersten <[email protected]> wrote: > > > > > > > > > Hi, > > > > > > > > > I'm trying to figure out the best way of structuring complex applications > > in Om and I've hit a bit of a brick wall that I'm hoping someone can help > > me with. > > > > > > > > > > > > > > > > > > I like the concept of cursors - narrow down the application state to what > > the individual components actually need and allow them to read and modify > > only that. > > > > > > > > > The problem I'm having is that I don't know how to structure my state so > > that the correct components have access to everything they need. Its easy > > if each component only requires a strict subset of its parent, which is > > often the case, but not always. I've hit a scenario where a component needs > > access to two very different branches of the app state and I'm not sure how > > to pass it to the component that needs it. > > > > > > > > > > > > > > > > > > > As a (contrived) example, imagine you had an app for displaying orders in > > an online store and the application state is something like this: > > > > > > > > > (def app-state (atom {:items [{:type "book" :price 123} {:type "cd" :price > > 200}] > > > > > > > > > > > > :orders [{:date xxx :type "book" :count 3} {:date yyy > > :type "cd" :count 1}] > > > :filter "book"})) > > > > > > > > > > > > > > > > > > You can imagine that in a real application the :items and :orders branches > > may be much deeper. > > > > > > > > > Lets say I now have two components, one displaying the items (so it is > > passed a cursor with path [:items]) and one displaying the orders (so it is > > passed a cursor with path [:orders]). What if I now only want to display > > items and orders where the type matches the filter? > > > > > > > > > > > > > > > > > > > I have a few options: > > > Restructure the app state in a way that gives each component access to what > > it needs. This is not ideal as it means that I'm modelling my state after > > how its being rendered rather than how its being processed and makes it > > very application specific. > > > > > > > > > > I can propagate the additional values down the component tree (eg using the > > :state parameter to build), but this means that every other component > > before the one that consumes it must now do additional work that it > > shouldn't need to know about (couples the parent components too tightly to > > the child one) > > > > > > > > > > Similarly, passing it in opts is not ideal as it has the same issue as #2, > > with the added caveat that the component also won't rerender on change.I > > can store the value in component local state and update it through a > > core.async channel. This works well in the example above, where one or two > > simple values need to be communicated, but gets unruly when the application > > is more complex. > > > > > > > > > > > I can pass the entire app state to each component (perhaps trough shared > > state) and use transformation functions (similar to what Sean Grove did in > > his recent slides) to transform the state into a local view for each > > component. This means each component gets to select exactly what it needs > > to access without worrying about what comes before or after it in the > > hierarchy, but then you lose the benefit of cursors and automatic > > re-rendering when something changes. > > > > > > > > > > > > > > > > > > > I'm sure I'm missing something! > > > > > > > > > Any tips appreciated. > > > > > > > > > Dan. > > > > > > > > > > > > > > > -- > > > > > > 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. -- 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.
