使用请求编写结构化 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)))))))
这不是您问题的答案,但您可以深入了解示例
我想用 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)))))))
这不是您问题的答案,但您可以深入了解示例