I didn't read your code closely enough. Looks like you're putting cursors
into your components local state? And it also looks you are extending
ICloneable to String. Best to avoid both of these things.

Cursors give Om modularity, but they also require you to think a bit more
carefully about the types that involved in your program.

David


On Wed, Mar 12, 2014 at 12:51 PM, Mathias Picker
<[email protected]>wrote:

> Am Mittwoch, 12. März 2014 17:23:04 UTC+1 schrieb David Nolen:
> > Om renders on requestAnimationFrame. That means by the time your handler
> executes it may not have an accurate picture of the application state.
> Cursors cannot be directly manipulated outside of the consistent phase of
> the application (render). You can however *deref* the cursor in your
> handler to get the most recent value:
> >
> >
> >
> > (defmulti handle-change (fn [e state owner]  (:validate @state)))
>
> I thought so, too, and tried that allready. Up came another exception:
>
> "Uncaught Error: No protocol method IDeref.-deref defined for type
> cljs.core/PersistentArrayMap: {:text #<Ben>, :hint #<max. 30 Zeichen>,
> :validate #<max-30>} "
>
> I then tried @(:validate state), but that threw me the same exception...
> That was when I concluded I didn't really understand state/cursors.
>
> And, btw: *thanks*(!!) for om, it's a joy to work with!
>
> / Mathias
> ...
> "
> >
> >
> >
> > HTH,
> > David
> >
> >
> >
> >
> > On Wed, Mar 12, 2014 at 12:07 PM, Mathias Picker <[email protected]>
> wrote:
> >
> > Hi all,
> >
> >
> >
> > I'm trying to understand om and build a simple input field with
> validation, hacked together from the tutorial.
> >
> >
> >
> > For some data like this
> >
> >
> >
> > {:key "name"
> >
> >  :value "Ben"
> >
> >  :hint "max. 30 Zeichen"
> >
> >  :validate "max-30"}
> >
> >
> >
> > and a component like this:
> >
> >
> >
> > (defmulti handle-change (fn [e state owner]  (:validate state)))
> >
> > (defmethod handle-change "max-30" [e state owner]
> >
> >   (handle-change-max-30 e state owner))
> >
> > (defmethod handle-change :default [e state owner]
> >
> >   (om/set-state! owner :hint "Que?"))
> >
> >
> >
> > (defn input-view [entry owner]
> >
> >   (reify
> >
> >     om/IInitState
> >
> >     (init-state [this]
> >
> >       {:text (:value entry)
> >
> >        :hint (:hint entry)
> >
> >        :validate (:validate entry)})
> >
> >     om/IRenderState
> >
> >     (render-state [this state]
> >
> >       (dom/div nil
> >
> >                (dom/input
> >
> >                 #js {:type "text"
> >
> >                      :value (:text state)
> >
> >                      :onChange #(handle-change % state owner)
> >
> >                (dom/span nil (str " " (:hint state)))))))
> >
> >
> >
> >
> >
> > I get
> >
> >
> >
> > "Uncaught Error: Cannot manipulate cursor outside of render phase, only
> om.core/transact!, om.core/update!, and cljs.core/deref operations allowed".
> >
> >
> >
> > when I start to edit the field.
> >
> >
> >
> > So I thought I needed to deref the entry in init-state, but sadly om
> says that's not allowed in the render phase. (at least I now know that init
> is part of the render phase...)
> >
> >
> >
> > So, it seems I'm not understanding something here... I'm new to clojure
> and om/react. Can someone give me some way to better understand what's
> going on? Is my sketch a useful way of thinking about this in om, or do I
> need to look at this from a different angle?
> >
> >
> >
> >
> >
> >
> >
> >
> > Thanks for any help, pointers new ways of doing this,
> >
> >
> >
> > Mathias
> >
> >
> >
> > --
> >
> > 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.

Reply via email to