That's really instructive! Thanks Daniel.
2014年7月3日木曜日 18時30分29秒 UTC-4 Daniel Kersten:
> The two common types of errors I see in Om are the ITransact error that you
> encountered and the IDeref one.
>
>
> The former happens when you try to transact on something that isn't a cursor.
> The two main reasons that I've seen where this happens are:
>
>
>
>
> 1. If you are trying to access a primitive:
> (def (atom app-state {:foo "Foo"})
>
>
> (defn bar [app owner]
> ...
> (om/update! app ...)
>
>
>
>
> Then in the root component:
> (om/build bar (:foo app)
>
>
> 2. If you set part of a cursor to a sequence. This is what happened in your
> case.
>
>
> The key thing to remember is that only maps an vectors (by default, at least)
> are turned into cursors! If you see the ITransact error, check what you set
> the state to. This can be mystifying if the state is passed directly from the
> server. You could protect against this by always calling vec on data received
> from the server before placing it in the app state (if its not a map, of
> course).
>
>
>
>
> The IDeref happens when you pass a cursor to code that runs outside of the Om
> render phase (or code that you thought runs outside render actually gets
> called during render). Generally it means you forgot to deref/@ the cursor.
>
>
>
>
> Another error that I've hit a few times (but seem to have internalized now)
> is forgetting to use (apply dom/div nil (map ...)) instead of (dom/div nil
> (map ...)).
>
>
> One other error that had me stumped was something about being unable to
> update an unmounted component. This was a tricky one to debug, but basically
> what happened was I was calling om/update on owner inside a go block that I
> set up in IWillMount, but the go block sticks around after the component is
> unmounted (and gets duplicated when remounting!). The key thing to remember
> is that if a component sets up go blocks in will-mount and the component may
> get unmounted, you need to make sure to dispose of it from IWillUnmount (eg
> by having a "kill" channel that the go block waits on using alt/alts).
>
>
>
>
> The error you've encountered is the only one that I've seen caused by errors
> on the server, but as I said above, you could protect against this in the
> client.
>
>
>
>
>
> On 3 July 2014 19:18, Alex Huang <[email protected]> wrote:
>
>
> Hi everyone, beginner to cljs here.
>
>
>
> I just worked through the Intermediate Tutorial for Om at
> https://github.com/swannodette/om/wiki/Intermediate-Tutorial by following the
> explanations and typing along.
>
>
>
>
>
> The tutorial ends with editable input fields rendered by React and persisted
> in Datomic. At this point I encountered this error in the console (bug is in
> my code; keep reading):
>
>
>
> Uncaught Error: No protocol method ITransact.-transact! defined for type
> cljs.core/PersistentHashMap: {:class/id "6946", :db/id 17592186045423,
> :class/students #{{:db/id 17592186045428} {:db/id 17592186045430} {:db/id
> 17592186045431} {:db/id 175921...<omitted>...}} core.cljs:136
>
>
>
>
>
> So firstly the line doesn't match up. But I fiddle around with the "data"
> variable getting passed around in the "handle-change" function in core.cljs
> to no avail. I can cause another interface error which I'm not familiar with,
> and the line number doesn't change.
>
>
>
>
>
> Then I redid the entire tutorial and copy+pasted whenever possible, and
> realized that what causes this error is a missing "vec" argument in my
> (server-side!) core.clj:
>
>
>
> (defn get-classes [db]
>
> (->> (d/q '[:find ?class
>
> :where
>
> [?class :class/id]]
>
> db)
>
> (map #(d/touch (d/entity db (first %))))
>
> ;; BUG: when absent, leads to cljs error!
>
> ;; vec
>
> ))
>
>
>
> Totally didn't see that coming! My question is this. When you encounter an
> error like the one above, what clues tell you to look in the server-side clj
> rather than the client-side cljs?
>
>
>
> Thanks!
>
>
>
> --
>
> 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.