使用请求编写结构化 Om 应用程序,但不使用 om.next

Writing a structured Om application with requests, but not om.next

我想用 Om 编写一个应用程序 - 特别是 GitHub 问题查看器。要从 GitHub 检索问题,我需要 XHR 请求它们,并且将通过向 GitHub.[=11 发回请求将问题标记为 'viewed' 的操作=]

有很多关于在没有 async/http 调用的情况下使用当前版本的 Om 的文档,还有很多关于使用它们的 Om.next 的文档,但我才刚刚开始,感觉Om.next 不是完整的 ClojureScript 新手潜入的正确地方。

是否有文档和模式可以将当前稳定版本的 Om (0.8.x) 与远程资源一起使用,从而为此类应用程序带来干净的架构?在生产中使用 Om 的大型应用程序,如 CircleCI - 他们是否使用 Om.next?如果不是,普遍接受的请求模式是什么?

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

关于 Om,有一个专用于 "idioms and patterns", linked from the tutorial section 的存储库。虽然我不会说任何东西都是用大理石写的,但请准备好进行一些实验。

我认为,您可以深入了解 om 的 real-world example. They are using Google Closure's 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)))))))

这不是您问题的答案,但您可以深入了解示例