Hi all, I have read the docs but might have overlooked something.

I keep seeing components being updated in response to state changes but I don't 
see the latest state in that component.

For example, in the following:

(defn- make-rows
  [on-click selected-id]
  (js/console.log "rows has selected-id: " selected-id)
  [:tbody
   (for [idx (range 10)]
     [:tr
      {:class    (when (= selected-id idx) "selected")
       :on-click #(do (on-click idx) nil)}
      [:td "Some state"]])])

(defn make-table []
  (let [selected-id (subscribe [:search/selected-journey-id])]
    (fn []
      (js/console.log "make-table has selected-id: " @selected-id)
      [table/table {:headers [{:class :ignore-me :text "whatever"}]
                    :rows    (make-rows #(dispatch [:search/select-journey-id 
%])
                                        @selected-id)}])))

when I call [make-table] then I can see both make-table and make-rows being 
called with the new selected-id, but table/table never gets the new 
selected-id, it is always called with the old selected-id. It is as if the 
invocation to (rows) is cached.

Changing make-table to use [make-rows] makes the problem worse as only 
make-tables is called in response to the selected-id changing.

The only way I can get this to work is to make-rows itself subscribe to the 
selected-id:

(defn- make-rows
  [on-click]
  (let [selected-id (subscribe [:search/selected-journey-id])]
    (fn []
      (js/console.log "rows has selected-id: " @selected-id)
      [:tbody
       (for [idx (range 10)]
         [:tr
          {:class    (when (= @selected-id idx) "selected")
           :on-click #(do (on-click idx) nil)}
          [:td "Some state"]])])))

(defn make-table []
  [table/table {:headers [{:class :ignore-me :text "whatever"}]
                :rows    [make-rows #(dispatch [:search/select-journey-id 
%])]}])

Can somebody please explain why calling an fn with a @subscription is the wrong 
thing to do.

Thanks for reading this far ;).


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