Элемент таргетинга Clojurescript OM на другом HTML

Итак, я начинаю изучать clojurescript и просматриваю различные руководства по нему. Одна вещь, которую я не смог выяснить, - это указать идентификатор элемента в определенном html-файле, чтобы поместить мои разметки.

Допустим, у меня есть два html-файла, index.html и about.html. Я хочу нацелить свой код ниже на идентификатор элемента «приложение» на about.html, когда URL-адрес указывает на http://localhost:3449/about

код :

(om/root
  (fn [data owner]
    (reify
      om/IRender
      (render [_]
        (dom/p nil (:text data)))))
  app-state
  {:target (. js/document (getElementById "app"))}) 

Что было бы лучшим подходом для этого? Или, может быть, ссылку, чтобы я мог посмотреть на это. Или, может быть, я что-то упускаю здесь, и, может быть, кто-то может просветить меня.

Также я пытался использовать этот https://github.com/gf3/secretary, но я не уверен если это лучший подход, поскольку URL-адреса должны иметь хэш-ключ (http://localhost:3449/#/about ) для запуска.

Обновление:

Итак, я использовал ответ ниже, и он сработал, но перед тем, как заставить его работать, я столкнулся с некоторой проблемой. В любом случае кто-то столкнулся с этим сообщением и использовал ответ ниже, но получил неопределенную проблему, проверьте мой окончательный код.

:cljsbuild раздел вашего project.clj

:cljsbuild {:builds [{ :id "dev" :source-paths ["src/clj" "src/cljs"] :compiler {:output-to "resources/public/js/main.js" :output-dir "resources/public/js/out/" :optimizations :none :pretty-print true}}]}

включил файлы js на about.html

<script src="js/out/goog/base.js" type="text/javascript"></script> <script src="js/main.js" type="text/javascript"></script> <script type="text/javascript">goog.require("om_async.about");</script> <script type="text/javascript">om_async.about.init();</script>


person Robin Carlo Catacutan    schedule 24.04.2015    source источник


Ответы (1)


Вам нужно добавить файл javascript в файл html, в котором вы хотите его использовать. Поэтому, если у вас есть два разных файла html index и about, вам понадобятся два разных файла cljs.

Оба они будут содержать метод для инициализации js, подобный этому

(defn ^:export init []
  (om/root
    (fn [data owner]
      (reify
        om/IRender
        (render [_]
          (dom/p nil (:text data)))))
    app-state
    {:target (. js/document (getElementById "app"))}))

И в вашем файле about.html вы будете вызывать js следующим образом:

<script type="text/javascript">your.namespace.about.init();</script>

И в index.html:

<script type="text/javascript">your.namespace.index.init();</script>

По крайней мере, я так сделал. Мне было бы любопытно узнать, есть ли более элегантные способы сделать это.

Обновление: обратите внимание на функцию экспорта здесь внизу: https://github.com/sveri/siwf/blob/master/src/cljs/de/sveri./siwf/groups.cljs и здесь для html, в котором используется функция: https://github.com/sveri/siwf/blob/master/resources/templates/groups.html

Трудно сказать, что происходит у вас дома, скорее всего, это проблема с пространством имен.
Также не забудьте добавить скомпилированный файл js перед вызовом:

<script src="/js/app.js"></script>
<script type="text/javascript">your.namespace.index.init();</script>
person sveri    schedule 24.04.2015