ClojureScript/Om: в отображаемом HTML отсутствуют атрибуты

У меня есть очень простое приложение ClojureScript/Om. Кажется, немного сломан.

Это основной файл:

(ns demo.core
  (:require-macros [cljs.core.async.macros :refer [go]])
  (:require [goog.events :as events]
            [cljs.core.async :as async :refer [>! <! put! chan]]
            [om.core :as om :include-macros true]
            [om.dom :as dom :include-macros true]
            [goog.events.EventType :as EventType]
            [clojure.string :as string]))

(defn layout
  [app owner]
  (reify
    om/IRender
    (render [_]
      (dom/div {:id "some-id"} "Pumpkin"))))

(defn main []
  (om/root
    layout
    {}
    {:target (. js/document (getElementById "app"))}))

Он отображает этот HTML:

<div id="app">
    <div data-reactid=".0">Pumpkin</div>
</div>

Почему у div нет идентификатора #some-id?


person Sir Robert    schedule 03.02.2015    source источник


Ответы (1)


Вам нужно использовать литерал #js {} для чтения, чтобы указать объект JS, а не старую простую карту:

(dom/div #js {:id "some-id"} "Pumpkin")

Это немного проработано в учебнике по Om.

person Andrew Marshall    schedule 03.02.2015
comment
Хорошо, я согласен с этим... но как мне установить произвольные атрибуты, отличные от js? У меня есть код из другого проекта, который не нуждается в #js для работы и может использовать {:class foo} вместо {:className foo}, и он выглядит нормально. Видимо, я недостаточно хорошо понимаю, что происходит, чтобы увидеть разницу. Какие-нибудь советы? - person Sir Robert; 03.02.2015
comment
@SirRobert Вы не устанавливаете «атрибут JS». #js {} просто создает объект JavaScript, а не карту Clojure(Script); это часть ClojureScript, а не Om. Это необходимо, потому что это передается прямо в React, который понимает только объекты JS, а не карты CLJS. Вы можете прочитать о поддерживаемых React DOM-атрибутах. для получения дополнительной информации. - person Andrew Marshall; 03.02.2015
comment
@SirRobert Тем не менее, я не уверен, почему {:class "foo"} сработало в другом вашем проекте. Возможно, либо Ом обрабатывает это специально (я не проверял это), либо использовался альтернативный синтаксис DOM. - person Andrew Marshall; 03.02.2015
comment
Я вижу, что происходит. В другом проекте они использовали [om-tools.dom :as dom], а не [om.dom :as dom]. Очевидно, om-tools предоставляет немного сахара для таких вещей (github.com/Prismatic/om -tools#dom-tools). - person Sir Robert; 03.02.2015