2015-05-05 12 views
7

Robię Ajax GET z mojej aplikacji Reagent, aby załadować pewne rzeczy z bazy danych.Ajax GET z Reagentem

Nie jestem do końca pewien, jaki jest najlepszy sposób uzyskania wyniku takiego wywołania ajaxowego na mojej stronie, biorąc pod uwagę, że jeśli umieściłem go w atomie, to Reagent automatycznie ponownie wyświetli komponent po dereferencji atomu, co oznacza, że ​​otrzymuję nieskończoną sekwencję wywołań ajaxowych.

jakiegoś kodu,

(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))))) 

Funkcja ta zasadniczo tworzy [:ul [:li "Stuff here"] [:li "And here"]]

której chciałbym wyświetlane na mojej stronie, która teraz ma następujący kod.

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

W jaki sposób uruchamia się żądanie 'GET'? Czy ładuje się strona? Lub tylko jeśli potrzebujesz tego składnika odczynnika? A może akcja użytkownika? Kompilujesz tutaj wiele rzeczy. Wrzuciłem tylko dane (nie czkawkę) do atomu i renderowałem listę na stronie "zestawienia". Jeśli chcesz poprosić o to tylko raz, możesz sprawdzić "Opóźnienie" i podać opóźnienie na stronie "zestawienia". Ale znowu, to zależy od twojego przypadku użycia (stąd pierwsze kilka pytań) – ClojureMostly

+0

Tak, nigdy nie wywołuj kodu wywołującego efekt uboczny bezpośrednio z renderowania. Zrób to z funkcji cyklu życia (np. Zamontuj wolę lub zamontuj) lub w komponencie odczynnika init (jak pokazano w odpowiedzi Michiel Borkent). – Dan

Odpowiedz

10

Myślę, że lepiej jest zapisać tylko dane w atomie i wygenerować kod HTML jako część logiki komponentu.

Również lepiej wywołać wywołanie AJAX poza fazą renderowania, na przykład przed zamontowaniem komponentu lub w wyniku zdarzenia (na przykład kliknięcie przycisku).

Jak to:

(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 ...])]))) 

To się nazywa forma-2 w this post.

+1

Dzięki Michiel. Twój komentarz był bardzo pomocny i zrozumiałem logikę nieco lepiej :) Do zobaczenia na Meetup! – Helios

+0

Czy kluczem do formy-2 nie jest zwracanie funkcji? Jeśli tak, dlaczego konieczne jest użycie 'let'? Nie można wykonać następujących czynności: (def meczów (atom zero) (defn component [] (GET "/ ...": handler (fn [odpowiedź] (reset! Mecze (: odpowiedź ciała)))) (fn [] [: ul (dla [m mecz] ^ {key ...} [: li ...])].)) – DandyDev

+0

@DandyDev można po prostu stworzony nazwa wyrażać intencje, ale można obejść się bez funkcji. –

Powiązane problemy