2013-03-15 5 views
5

私はclojureとclojurescriptでRIAを開発しています。バックエンドは、AJAX呼び出しを実行せずに結果のHTML、すなわち内clojurescriptするajaxリクエストなしでclojureからclojurescriptにednを渡すにはどうすればいいですか?(ヒカップ生成ページから)

(html5 
[:head 
    (include-js "/js/my-cljs-generated.js")] 
[:body ... ]) 

どのように私は(などハッシュマップ、ベクトル、)EDNを渡すことができるように、結果のHTMLを生成するために、しゃっくりを使用していますか?私はしゃっくりをしたいと思い

はこのような何かを実行します(。例えば、名前で)

(include-edn 
    "var_name" {:foo :bar}) ; or any other clojure data 

何とかcljsから渡されたEDNにアクセスできるようにします。

現在、私の実装は少しハックして格納されEDNグローバルのjs VAR

(hiccup/javascript-tag (str "var edn = \"" 
         (pr-str my-clojure-data) "\";"))   

とcljs側に

(jayq/document-ready 
    (fn [] 
    (if-let [edn (.-edn js/window)] 
     (do-something-with (cljs.reader/read-string edn)) 
    ) 
    ... 
) 

のようななめらかは多分これを達成するためのより多くの慣用的な方法はあるのでしょうか?

答えて

1

あなたの「実装」はまったく問題ありません。あなたがもっと快適に感じられるようにするには、関数にラップしてください:)

代わりにClojureScriptをコンパイルします。値はまだグローバルで変更可能です。

1

プッシュではなく、プッシュ(イベントベース)アプローチを考えることができます。生成されたednデータを、JavaScriptスクリプトの引数としてclojurescript関数の引数として[:script]タグ内に挿入します。スクリプトがブラウザによって読み込まれると、ednがハンドラ関数に送られ、アプリケーションによってロードされます。

これは、状態データまたはグローバルデータを必要とせず、必要に応じて後でajaxを使用するように簡単に調整できるため、現在のアプローチよりも少し慣れています。

+1

私は、プッシュベースのアプローチがより慣用的であるとは反対します。たとえば、core.asyncは、コールバックによって通常導入される制御の逆転を最小限に抑えようとします。 –

2

あなたのアプローチは問題ありません。 JavaScriptコードを手動で作成することに懸念がある場合は、pr-strの結果をデータとして適切に定義した要素に入れることもできます。線に沿って何か:

(defn get-data 
    [tag] 
    (-> (.getElementById js/document "server-originated-data") 
     (.getAttribute (str "data-" tag)) 
     (cljs.reader/read-string))) 

けれども、もう一度、あなたのアプローチは結構です:

[:div {:style {:display "hidden"} 
     :id "server-originated-data" 
     :data-var-1 (pr-str var-1) 
     :data-var-2 (pr-str var-2)}] 

そのあとのようなものでClojureScriptからそのデータを取得することができます。

関連する問題