2016-07-07 8 views
3

私は、WebページにCodeMirrorを埋め込み、複数のコードスニペットを1つずつ編集しようとしています。このI行うにClojureScript:Reagentを使ってCodeMirrorを反応的に変更する方法

  • は、コードスニペットのマップを含む1個の試薬原子node-defs-atomを持っています。
  • もう1つのアトムを持つnode-history-atomスニペットのキーが含まれています。
  • キーのコードマップの値にCodeMirrorの値を設定します。

は、ここでは動作しません何:CodeMirror内のテキストに何もしないreset!node-history-atomを変更

(defn editor [node-defs-atom node-history-atom] 
    (reagent/create-class 
    {:reagent-render (fn [] (do [:textarea 
        { :value (@node-defs-atom (last @node-history-atom)) 
         :auto-complete "off"}])) 
    :component-did-mount (editor-did-mount node-defs-atom node-history-atom) 
    })) 

(defn editor-did-mount [node-defs-atom node-history-atom] 
    (fn [this] 
    (let [codemirror (.fromTextArea js/CodeMirror 
            (reagent/dom-node this) 
            #js {:mode "clojure" 
              :lineNumbers true})] 

          ......))) 

。私は本当に何がうまくいかないのかよく分かりません。

誰かが私がどこに参照を入れるべきか教えていただけたら、(@node-defs-atom (last @node-history-atom))に感謝します。

ありがとうございます!

答えて

3

次に、あなたのビューは、試薬のクラスになりますCodeMirrorエディタ

  • 空のノード

    (def cm (atom nil)) 
    
    (reset! cm (js/CodeMirror. 
          (.createElement js/document "div") 
          (clj->js {...}))) 
    
  • にCMのインスタンスを作成して対処するための別の方法を試すことができますし、wrapper-idだけです親のID

    (reagent/create-class 
        {:reagent-render   (fn [] @cm [:div {:id wrapper-id}]) 
        :component-did-update update-comp 
        :component-did-mount update-comp}) 
    
  • fuを作成する

    (defn update-comp [this] 
        (when @cm 
        (when-let [node (or (js/document.getElementById wrapper-id) 
             (reagent/dom-node this))] 
         (.appendChild node (.getWrapperElement @cm)))) 
    
+0

本当にありがとうございましたDOMノードにCMを追加しnction。私はこれを有効にすることができましたが、node-history-atomの値に基づいて反応的に起こるのではなく、テキストを変更するたびに.setValueを呼び出す必要がありました。このようにすることは可能ですか? – Boyentenbi

+0

CodeMirrorはステートフルであり、想定するたびに作成したくないため、新しい値を割り当てるたびに.setValueを呼び出す必要があります。しかし、割り当ては '(.setValue @ text-atom)'マクロによって簡単に行えます。 – SerCe

関連する問題