ソースを参照

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 年 前
コミット
ad89d3d16e
共有1 個のファイルを変更した11 個の追加19 個の削除を含む
  1. 11 19
      clj/clarity/cljs/clarity.cljs

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

16
    :data "hello"}))
16
    :data "hello"}))
17
17
18
(defmulti make-typed-input
18
(defmulti make-typed-input
19
  (fn [type & _]
19
  (fn [{type :type} & _]
20
    (if (seq? type)
20
    (if (seq? type)
21
      (first type)
21
      (first type)
22
      type)))
22
      type)))
23
23
24
(defn change-data
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
   (when (pred (.-target ev))
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
(defn valid? [el]
31
(defn valid? [el]
32
  (.. el -validity -valid))
32
  (.. el -validity -valid))
37
      (keyword name)
37
      (keyword name)
38
      nil)))
38
      nil)))
39
39
40
(defmethod make-typed-input 'Keyword [type data owner]
40
(defmethod make-typed-input 'Keyword [d owner]
41
  (reify
41
  (reify
42
    om/IInitState
43
    (init-state [_] {:data data})
44
    om/IRender
42
    om/IRender
45
    (render [_]
43
    (render [_]
46
      (dom/input #js {:type text
44
      (dom/input #js {:type text
47
                      :placeholder ":my.ns/identifier"
45
                      :placeholder ":my.ns/identifier"
48
                      :pattern "^:(\\w+|\\w+(\\.\\w+)*\\/\\w+)$"
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
  (reify
50
  (reify
53
    om/IInitState
54
    (init-state [_] {:data data})
55
    om/IRender
51
    om/IRender
56
    (render [_]
52
    (render [_]
57
      (dom/input #js {:type "text"
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"))