2017-01-19 7 views
0

私は、コンボボックスや先読みコンポーネントと同様に、リンクされたテキストボックスとリストコンポーネントに取り組んでいます。リストから項目をクリックしない限り、選択した項目のテキストでテキストボックスを上書きしない限り、テキストボックスに自由にテキストを入力できます。試薬はラットの最初のトランジションで再レンダリングしません

これらの2つのコンポーネントは、選択状態を維持するratomを所有する1つの親divに含まれています。 ratomは最初はゼロですが、リスト項目が選択されると更新されます。私は、テキストボックスの値がratomの内容がnilでない場合にのみ更新され、ratomの値がnilの場合はフリーエントリーをpremitしたいと思います。

これは、リストコンポーネントの2回目以降のクリックに対してのみ有効です。コンソールの検査でvalue属性が更新されていることが示されていても、テキストボックスは最初のクリックでは更新されません。だから、それはレンダリングを起動する問題のように見えます。

ここでは、コードは(dommyを使用しています)です...

(defn text-box [selection] 
    [:input.jdropbtn 
    (into 
    {:type  :text 
     :placeholder "Dropdown" 
     :on-change #(.log js/console 
          (let [v (-> % .-target .-value) 
           opts (-> % .-target .-nextSibling dom/children array-seq)] 
          ;(doseq [t opts] (dom/toggle! t (clojure.string/includes? (dom/text t) v))) 
          ))} 

    (when @selection 
     {:value (:value @selection)}) ; This fails on first selection! 

    ; {:value (:value @selection)} ; This prevents free typing! 

    ) 
    ] 
) 

(defn list-component [selection data-key items] 
    [:div.jdropdown-content 

    (for [i items] 
    (let [{:keys [id value] :as item} i] 
     ^{:key id} [:a {data-key id :on-click #(reset! selection {:id id :value value}) } value]) 
    ) 
    ] 
) 

;;;;;;;;;;;;;; parent 
(defn my-droplist [data-key items] 
    (let [selection (r/atom nil) ] 
    (fn [] 
     [:div.jdropdown {:id "jack"} 
     [text-box selection] 
     [list-component selection data-key items] 
     ]) 
    )) 


    ; invoked as: 

[my-droplist :data-appid 
    [{:id 11 :value "Hey there!"} 
     {:id 22 :value "Hi there!"} 
     {:id 33 :value "Ho there!"}]] 

スタイリングは、本質的にW3Schoolsの(http://www.w3schools.com/css/css_dropdowns.asp)からドロップダウンメニューCSSの例と同じです。

TIA。

答えて

1

これはすべてコントロールに関するものです。試薬は共有を好まない。テキストボックスの値を常にratomから設定して、変更時のratomを更新すると、それは機能します。また、ratomはnilではなく空の文字列に初期化されます。

単純に逆参照いつも(私が元々行っていたように)助けなかった。私は実際にと書いてあります。ラトムの値を毎回テキストボックスの値に書きます。