Я изучаю ClojureScript, у меня есть две функции, которые просто изменяют содержимое в div "root-app":
(ns blog.core)
(defn mount-components []
(let [content (js/document.getElementById "root-app")]
(while (.hasChildNodes content)
(.removeChild content (.-lastChild content)))
(.appendChild content (js/document.createTextNode "Wilkommen zu mein
ekelhaft blog!!"))))
(defn init! []
(def current_url js/window.location.href)
(if (clojure.string/includes? current_url "about")
(.log js/console (str "Whatever URL ->>>" js/window.location.href))
(mount-components)))
Все работает нормально в http://localhost:3000/about, потому что в нем существует div "root-app" страницу, но в http://localhost:3000/blog я получаю сообщение об ошибке:
Потому что на этой странице нет такого div. Все это странно, потому что похоже, что ClojureScript на самом деле обнаруживает, что:
(if (clojure.string/includes? current_url "about")
на самом деле ложно, а журнал console.log не печатается.
У меня вопрос: почему функция mount-components запускается и отправляет сообщение об ошибке, даже если условное if ложно? Странно то, что console.log:
(.log js/console (str "Whatever URL ->>>" js/window.location.href))
не запускается, но работает функция mount-components. Думаю, я не понимаю «последовательность» в том, как работает ClojureScript.
content
имеет значение null. Идентификатор элемента правильный? Это в основном NPE. - person Carcigenicate   schedule 13.10.2017let
наwhen-let
, чтобы запускался только при обнаружении элемента. См. clojuredocs.org/clojure.core/when-let. - person Oles Savluk   schedule 13.10.2017def
внутри области действия функции, что вы делаете в функцииinit!
.def
создает переменную в глобальной области видимости. Вместо этого используйте локальную привязку сlet
. - person Toni Vanhala   schedule 13.10.2017