Existem algumas bibliotecas Clojurescript Ajax, mas eu quero manter as dependências do projeto o mínimo possível e é a razão pela qual escolhi a biblioteca principal do Clojurescript para fazer a solicitação de ajax.
Clojure.browser.net é apenas um invólucro simples da biblioteca Closure net do Google. Sempre que você quiser saber mais informações sobre esse cliente ajax, verifique a documentação oficial do XHRio. .
(ns foxyeye.search
(:use-macros [dommy.macros :only [sel sel1]])
(:require [clojure.browser.event :as gevent]
[clojure.browser.net :as net]
[dommy.core :as dommy]
[clojure.string :as string]))
;; example template
(deftemplate search-result-item-template [item]
[:li
[:div.icon
[:img {:src (format "/img/languages/%s.png"
(string/lower-case (aget item "language")))}]]
[:div.data
[:h4 (aget item "name")
[:small (str "(" (aget item "prod_key") ")")]]
[:p [:strong "Latest version:"]
(aget item "version")]]])
;; callback for successful response - that parses json and renders template
(defn search-success [ev]
(let [response (.getResponseJson (.-target ev))]
(.log js/console "Rendering search results")
(dommy/append! (sel1 :#search-result-list)
(map #(search-result-item-template %1)
(aget response "results")))))
;; registers callbacks and makes request
(defn fetch-search-results [q]
(let [api-url "http://127.0.0.1:8080/search/query"
;; initialize ajax client
xhr (gnet/xhr-connection.)]
;; register handlers
(gevent/listen xhr :error #(.log js/console Error" %1))
(gevent/listen xhr :success search-success)
;; make request
(gnet/transmit xhr api-url "GET" {:q "json"})))
E aqui está uma lista de eventos suportados:
- : complete goog.net.EventType.COMPLETE
- : success goog.net.EventType.SUCCESS
- : erro goog.net.EventType.ERROR
- : timeout goog.net.EventType.TIMEOUT
- : pronto goog.net.EventType.READY}