2017-10-13 113 views
0

我學習ClojureScript,我有兩個功能,只是更改「根應用」的內容DIV:ClojureScript功能

(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因爲「根應用「分區存在於該頁面,但在http://localhost:3000/blog,我得到錯誤信息:

enter image description here

因爲在該頁面沒有這樣的股利。這一切都是奇怪,因爲它看起來像ClojureScript事實上認定:

(if (clojure.string/includes? current_url "about") 

其實是假的EN不打印的console.log。

我的問題是:爲什麼功能安裝組件運行併發送,即使有條件如果是虛假的錯誤信息?奇怪的是,該執行console.log:

(.log js/console (str "Whatever URL ->>>" js/window.location.href)) 

不運行,但安裝組件功能一樣。我想我並不瞭解ClojureScript工作方式下的「序列」。

+3

顯然'content'爲空。元素ID是否正確?這基本上是一個NPE。 – Carcigenicate

+3

只有在找到元素時才用'let-let'替換'let'。見https://clojuredocs.org/clojure.core/when-let –

+2

你(幾乎)永遠不應該在函數作用域內使用'def',這是你在'init!'函數中做的。 'def'在全局範圍內創建一個var。改用'let'使用本地綁定。 –

回答

3

我不確定,但根據你的描述,我認爲你所考慮的邏輯和你正在測試的邏輯是不一樣的。你的if語句在URL中尋找單詞「about」。如果它在那裏,那麼它將打印控制檯日誌,即它將在那裏爲http://localhost:300/about。如果它不存在,它將運行mount-components函數,該函數會查找您所說未包含在頁面中的div ID,以便發現錯誤。 mount-components是一個ELSE語句,因此在測試爲false時執行。

3

if表單的工作方式與(if cond true-branch false-branch)類似,因此您的(mount-component)將被執行,因爲它位於假分支中。退房when,只有一個真正的分支。

+2

這就是答案。 if語句每個分支只需要1個表達式,沒有隱含的'do'。如果你想有條件地做多件事情,那麼你應該使用'when'(有一個隱含的'do')或者將多個語句包裝在'do'中 – bfabry