11

次のコードスニペットは機能しません

     headerElement (goog.dom/createDom
                    "div" (.strobj {"style" "background-color:#EEE"})
                    (:title note))

理由:

{...}はClojurescriptマップを作成します。javascriptオブジェクト/ハッシュが必要です。

質問:

この些細な変換を行うにはどうすればよいですか?

4

3 に答える 3

13

#jsリーダー リテラルを使用して、JavaScript オブジェクトまたは配列を作成することもできます。

あなたは書ける:

(def test1 #js {:foo 1 :bar false})

JavaScript コードを作成します。

namespace.test1 = {"bar":false, "foo":1};

配列の場合:

(def test2 #js [1 2 3 false nil true])

作成します:

namespace.test2 = [1, 2, 3, false, null, true];

関数を使用することもできclj->jsます:

(clj->js :style "background-color:#EEE")

これの良いところは、ネストされたデータ構造を変換して再帰的に動作することです。

私はそれについて投稿しました(私が自分自身を宣伝できる場合)

于 2014-08-28T07:27:38.007 に答える
3

cljs.core/js-obj がこれに役立ちます。(マップではなく)通常の配列/リストを取ることに注意してください。

headerElement (goog.dom/createDom
               "div" (js-obj "style" "background-color:#EEE")
               (:title note))
于 2012-06-14T21:54:00.253 に答える
1

このマクロを使用するjs-objと、キーワードを使用できます。

大きい

(defmacro obj [& key-values]
(let [obj-def (apply concat (map #(list (name (first %)) (last %))
     (partition 2 key-values)))]
    `(cljs.core/js-obj ~@obj-def)
))

使用法

(obj 
    :key someVal
    :otherKey (fn [a b] a)
)
于 2013-02-07T02:00:07.867 に答える