2015-05-05 20 views
7

我正在做我的試劑應用程序的Ajax GET,從數據庫中加載一些東西。Ajax GET與試劑

我不完全確定如何將這種ajax調用的結果獲得到我的頁面的最佳方式,考慮到如果我將它放在一個原子中,那麼Reagent會在原子解除引用時自動重新渲染組件,這意味着我得到無限的ajax調用序列。

對於一些代碼,

(def matches (atom nil)) 

(defn render-matches [ms] 
    (reset! matches (into [:ul] (map (fn [m] ^{:key m}[:li m]) 
            (walk/keywordize-keys (t/read (t/reader :json) ms))))) 

這個功能基本上創建了一個[:ul [:li "Stuff here"] [:li "And here"]]

,我想我的網頁,現在有下面的代碼顯示。

(defn standings-page [] 
    (GET "/list-matches" 
     {:handler render-matches}) 
    @matches) 
+0

如何觸發'GET'請求?在頁面加載?或者只有當您需要該試劑組分時?還是用戶操作?你在這裏收集了很多東西。我只會將數據(不是打嗝)放入原子中,並將列表呈現在「榜單頁面」中。如果您只需申請一次,您可以查看「延遲」並參考「排名頁面」中的延遲。但是,這又取決於你的用例(因此前幾個問題) – ClojureMostly

+0

是的,不要直接從渲染調用副作用代碼。要麼從一個生命週期的functin(像will-mount或did-mount)或者在試劑組件init中那樣做(如Michiel Borkent的答案所示)。 – Dan

回答

10

我認爲最好只保存原子中的數據並生成HTML作爲組件邏輯的一部分。

此外,最好在呈現階段之外觸發AJAX調用,例如,在組件掛載之前或作爲事件的結果(例如,按下按鈕上的按鈕)。

像這樣:

(def matches (atom nil)) 
(defn component [] 
    (let [get-stuff (fn [] (GET "/..." :handler (fn [response] 
          (reset! matches (:body response))))] 
    (get-stuff) <-- called before component mount 
    (fn [] 
     [:ul 
     (for [m match] 
      ^{:key ...} 
      [:li ...])]))) 

這就是所謂的形式-2 this post

+1

謝謝Michiel。您的評論非常有幫助,我理解這個邏輯更好一點:)在聚會上見到你! – Helios

+0

形式-2的關鍵不是你返回一個函數的事實嗎?如果是這樣,爲什麼有必要使用'let'?難道你不這樣做: (def matches(atom nil) (defn component [] (GET「/ ...」:handler(fn [response] (reset!matches(:body response)) )) (FN [] [:UL (對[M匹配] ^ {:關鍵...} [:李...])])。@DandyDev可我剛剛創建) – DandyDev

+0

名稱表達意圖,但是你可以沒有這個功能。 –