0
(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)函数创建一个 ref-cursor 来跟踪:selected-item. app-state当您单击 a 时selected-item-button,标题会更改以反映已放入地图的新值。但是,这只适用于一次。按下不同的按钮不会导致标题再次重新呈现,因此标题始终停留在您按下的第一个按钮的值上。

虽然,简单地添加merge带有附加关键字的 a 似乎可以使它工作......(与空地图合并也不起作用,尝试过!)

我对参考游标的理解是错误的吗?

4

1 回答 1

0

所以,这个问题非常简单。

(om/update! (om/root-cursor app-state) :selected-item item)

本来应该

(om/update! (om/root-cursor app-state) :selected-item @item)

注意该项目,因为它是一个游标,被取消引用。

于 2015-08-19T14:33:38.753 回答