I've been working on my first app using re-frame and have run into the first real hurdle that I need some help with.
Basically, the re-frame pattern for dealing with text inputs as I understand it is as follows:
- Create the input as part of a component, and dispatch a handler as the :on-change method
- In the handler, update a field in the app-db
- Subscribe the component to changes on the input field so that it will stay in sync with the app-db
This is essentially the way it is dealt with in the simple-example provided with re-frame. Unfortunately, when the input field is edited anywhere but the end of the textbox, the subscription fires and sets the value causing the cursor position to be reset to the end of the textbox. See
https://github.com/Day8/re-frame/issues/39 for more info.
I don't see this as being a major issue in reagent itself, but it causes problems with the mental model of re-frame. One of the real selling points of re-frame to me is the ability to just subscribe and re-render components without having to really worry about synchronizing renders, at least for basic elements. I ran into it specifically when loading fields to edit, where I would like to just subscribe the input value but will instead have to pass it in when calling the component initially. This means I'll lose the easy synchronization between the input value and the app-db, which kind of sucks.
I spent a couple hours yesterday trying to figure out how to get the cursor position to reset itself by adding it into my existing handlers, subs, and components with no real luck. I was able to get the cursor position to reset to the right position at the right time occasionally, but the majority of the time it would fire either too early or too late and end up in the wrong place.
Based on the re-frame wiki (
https://github.com/Day8/re-frame/wiki/Creating-Reagent-Components), it looks like there might be a way to do this using form-3 components, but this seems like a lot of extra work to unload onto anyone developing using re-frame.
My ideal thought is that developers could follow the way things are done in the existing simple-example as closely as possible. I think that it would mean some changes to how re-frame works, either by wrapping any subscriptions to input fields (and textarea) and resetting the cursor position after the update is fired, or adding some sort of helper method to make it easier for developers to implement when needed.
I hope that was clear, let me know if there's anywhere I've missed anything obvious or where I need to elaborate on the problem.