Browse Source

don't use local state for model/data changes.

this should be a bit more like it's meant to be used.
Lucas Stadler 12 years ago
parent
commit
ad89d3d16e
1 changed files with 11 additions and 19 deletions
  1. 11 19
      clj/clarity/cljs/clarity.cljs

+ 11 - 19
clj/clarity/cljs/clarity.cljs

@ -16,17 +16,17 @@
16 16
    :data "hello"}))
17 17
18 18
(defmulti make-typed-input
19
  (fn [type & _]
19
  (fn [{type :type} & _]
20 20
    (if (seq? type)
21 21
      (first type)
22 22
      type)))
23 23
24 24
(defn change-data
25
  ([ev owner]
26
   (om/set-state! owner :data (.. ev -target -value)))
27
  ([ev owner pred parse]
25
  ([ev d]
26
   (om/update! d assoc :data (.. ev -target -value)))
27
  ([ev d pred parse]
28 28
   (when (pred (.-target ev))
29
     (om/set-state! owner :data (parse (.. ev -target -value))))))
29
     (om/update! d assoc :data (parse (.. ev -target -value))))))
30 30
31 31
(defn valid? [el]
32 32
  (.. el -validity -valid))
@ -37,29 +37,21 @@
37 37
      (keyword name)
38 38
      nil)))
39 39
40
(defmethod make-typed-input 'Keyword [type data owner]
40
(defmethod make-typed-input 'Keyword [d owner]
41 41
  (reify
42
    om/IInitState
43
    (init-state [_] {:data data})
44 42
    om/IRender
45 43
    (render [_]
46 44
      (dom/input #js {:type text
47 45
                      :placeholder ":my.ns/identifier"
48 46
                      :pattern "^:(\\w+|\\w+(\\.\\w+)*\\/\\w+)$"
49
                      :onChange #(change-data % owner valid? read-keyword)}))))
47
                      :onChange #(change-data % d valid? read-keyword)}))))
50 48
51
(defmethod make-typed-input 'String [type data owner]
49
(defmethod make-typed-input 'String [d owner]
52 50
  (reify
53
    om/IInitState
54
    (init-state [_] {:data data})
55 51
    om/IRender
56 52
    (render [_]
57 53
      (dom/input #js {:type "text"
58
                      :value (om/get-state owner :data)
59
                      :onChange #(change-data % owner)}))))
54
                      :value (om/read d :data)
55
                      :onChange #(change-data % d)}))))
60 56
61
(defn typed-input [typed-data owner]
62
  (let [{:keys [type data]} typed-data]
63
    (make-typed-input type data owner)))
64
65
(om/root (atom {:type 'Keyword}) typed-input (.getElementById js/document "typed_input"))
57
(om/root (atom {:type 'Keyword}) make-typed-input (.getElementById js/document "typed_input"))