编写带有请求的结构化Om应用程序,但不是om.next

时间:2016-01-31 23:51:48

标签: clojurescript om

我想在Om中编写一个应用程序 - 特别是GitHub发布查看器。要从GitHub检索问题,我需要XHR请求它们,并且标记问题的行为是“已查看”#39;通过向GitHub发送请求。

关于使用当前版本的Om没有异步/ http调用的相当多的文档,以及使用Om.next的相当多的文档,但我刚刚开始并感觉像Om.next不适合完整的ClojureScript新手潜水。

是否有文档,是否有使用当前稳定版本的Om(0.8.x)和远程资源的模式,这导致这种应用程序的干净架构?在生产中使用Om的大型应用程序,如CircleCI - 是否使用Om.next?如果没有,那么普遍接受的请求模式是什么?

2 个答案:

答案 0 :(得分:2)

CircleCI前端目前用Om编写,但是they have plans to migrate to Om.next,它们解释了原因。

关于Om,有一个专门用于"idioms and patterns"的存储库,链接自tutorial section。我不会说任何东西都是用大理石写的,准备试验一下。

答案 1 :(得分:1)

我想,你可以在om real-world example中潜水。他们使用Google Closure的XhrIo进行异步http调用。

(defn edn-xhr [{:keys [method url data on-complete]}]
  (let [xhr (XhrIo.)]
    (events/listen xhr goog.net.EventType.COMPLETE
      (fn [e]
        (on-complete (reader/read-string (.getResponseText xhr)))))
    (. xhr
      (send url (meths method) (when data (pr-str data))
        #js {"Content-Type" "application/edn"}))))

在用户更改时通信服务器

(defn on-edit [id title]
  (edn-xhr
    {:method :put
     :url (str "class/" id "/update")
     :data {:class/title title}
     :on-complete
     (fn [res]
       (println "server response:" res))}))

om.core/IWillMount

上的数据加载
(defn classes-view [app owner]
  (reify
    om/IWillMount
    (will-mount [_]
      (edn-xhr
        {:method :get
         :url "classes"
         :on-complete #(om/transact! app :classes (fn [_] %))}))
    om/IRender
    (render [_]
      (dom/div #js {:id "classes"}
        (dom/h2 nil "Classes")
        (apply dom/ul nil
          (map
            (fn [class]
              (let [id (:class/id class)]
                (om/build editable class
                  {:opts {:edit-key :class/title
                          :on-edit #(on-edit id %)}})))
            (:classes app)))))))

这不是你的问题的答案,但你可以深入研究