(ns ^:figwheel-always refs-test.core
(:require [om.core :as om :include-macros true]
[om.dom :as dom :include-macros true]
[sablono.core :as html :refer-macros [html]]))
(enable-console-print!)
(def app-state
(atom {:items [{:text "cat"}
{:text "dog"}
{:text "bird"}]
:selected-item {}}))
(defn selected-item []
(om/ref-cursor (:selected-item (om/root-cursor app-state))))
(defn
selected-item-title
[_ owner]
(reify
om/IRender
(render [_]
(html
[:div
(let [selected (om/observe owner (selected-item))]
(if (empty? selected)
[:h1 "Nothing selected"]
[:h1 (:text selected)]))]))))
(defn
selected-item-button
[item owner]
(reify
om/IRender
(render [_]
(html
[:li
[:button {:on-click
(fn []
(om/update! (om/root-cursor app-state) :selected-item item) ;; this doesn't update
;;(om/update! (om/root-cursor app-state) :selected-item (merge item {:foo 1})) ;; this does
)} (:text item)]]))))
(defn
root
[cursor owner]
(reify
om/IRender
(render [_]
(html
[:div
(om/build selected-item-title {})
[:ul
(om/build-all selected-item-button (:items cursor))]]))))
(om/root root app-state
{:target (.getElementById js/document "app")})(https://www.refheap.com/108491)
(selected-item)函数将创建一个参考游标,用于跟踪app-state中的:selected-item键。当您单击一个selected-item-button时,标题会发生变化,以反映已放入映射中的新值。然而,这只起了一次作用。按下另一个按钮不会导致标题再次呈现,所以标题总是停留在您按下的第一个按钮的值。
虽然,简单地添加一个带有额外关键字的merge似乎会使它工作.(与空地图合并也不起作用,尝试过!)
我对裁判游标的理解是错误的吗?
发布于 2015-08-19 14:33:38
所以,这个问题很简单。
(om/update! (om/root-cursor app-state) :selected-item item)应该是
(om/update! (om/root-cursor app-state) :selected-item @item)注意该项,因为它是一个游标,因此是取消引用的。
https://stackoverflow.com/questions/32098177
复制相似问题