mpdairy / posh

A luxuriously simple and powerful way to make front-ends with DataScript and Reagent in Clojure.
Eclipse Public License 1.0
460 stars 45 forks source link

Entity included in a pull result by virtue of isComponent not reacting to change #19

Open charles-dyfis-net opened 7 years ago

charles-dyfis-net commented 7 years ago

Given the following setup:

(require '[datascript.core :as d])

(def test-schema
{:db/ident {:db/unique :db.unique/identity},
  :one/name {:db/cardinality :db.cardinality/one},
  :one/parts
  {:db/valueType :db.type/ref,
   :db/cardinality :db.cardinality/many,
   :db/isComponent true},
  :two/name {:db/cardinality :db.cardinality/one}})

(def conn (d/create-conn test-schema))

(d/transact! conn [
  {:db/id -1, :one/name "Hello", :one/parts -2},
  {:db/id -2, :two/name "World"}
])

...and the following ultra-minimal view:

(require '[posh.reagent :as p])
(require '[reagent.core :as r])
(require '[goog.dom :as gdom])
(p/posh! conn)
(defn app [conn]
  (let [state @(p/pull conn '[*] 1)]
     [:div (pr-str state)]))
(r/render-component [app conn] (gdom/getElement "app"))

...the view then contains both elements:

{:db/id 1, :one/name "Hello", :one/parts [{:db/id 2, :two/name "World"}]}

...and is correctly rerendered when the following transaction occurs:

(d/transact! conn [{:db/id 1, :one/name "Goodbye"}])

...but not this one:

(d/transact! conn [{:db/id 2, :two/name "Y'all"}])
eoliphan commented 6 years ago

I'm having this problem as well. I pull a deeply nested structure, but updating something down the tree, doesn't kick off a reaction.