5

clojure と clojurescript を使用して RIA を開発しています。バックエンドはhiccupを使用して、次のような結果のhtmlを生成します

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

結果のhtml内で、つまりajax呼び出しを行わずに、edn(ハッシュマップ、ベクターなど)をclojurescriptに渡すにはどうすればよいですか?

hiccup に次のようなことをさせたい:

(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側ではsmthのようにします

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

たぶん、これを達成するためのより慣用的な方法がありますか?

4

3 に答える 3

1

あなたの「実装」は完全に問題ありません。それがあなたをより快適にするなら、それを関数にラップしてください:)

たとえば、代わりにコンパイルされた ClojureScript を発行しても違いはありません。値は依然としてグローバルで変更可能です。

于 2013-03-16T20:47:42.227 に答える
1

プルではなく、プッシュ (イベントベース) アプローチを検討できます。生成された edn データを [:script] タグ内の文字列として配置し、javascript 呼び出し clojurescript 関数の引数として使用します。スクリプトがブラウザーによって読み込まれると、edn がハンドラー関数に送信され、アプリケーションによって読み込まれるようになります。

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

于 2013-03-27T10:37:12.417 に答える