Написание структурированного приложения Om с запросами, но не om.next

Я хотел бы написать приложение в Om - в частности, GitHub выдает просмотрщик. Чтобы получить проблемы из GitHub, мне нужно будет запросить их через XHR, и будет действие пометить проблемы как «просмотренные», отправив запрос обратно в GitHub.

Существует довольно много документации по использованию текущей версии Om без асинхронных/http-вызовов и совсем немного по использованию с ними Om.next, но я только начинаю и чувствую, что Om.next — не то место. для полных новичков в ClojureScript.

Есть ли документация и шаблоны для использования текущей стабильной версии Om (0.8.x) с удаленными ресурсами, которые привели бы к чистой архитектуре для такого рода приложений? Большие приложения, использующие Om в производстве, такие как CircleCI, используют ли они Om.next? Если нет, то каков общепринятый шаблон запросов?


person tmcw    schedule 31.01.2016    source источник


Ответы (2)


Я думаю, вы можете погрузиться в пример из реальной жизни от om. Они используют XhrIo от Google Closure для асинхронных 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)))))))

Это не ответ на ваш вопрос, но вы можете погрузиться в примеры

person Stepan Kuzmin    schedule 04.02.2016

Внешний интерфейс CircleCI в настоящее время написан на Om, но у них есть планы перейти на Om.next, и они объясняют почему.

Что касается Ом, существует репозиторий, посвященный "идиомам и шаблонам", ссылка на который находится в учебный раздел. Хотя я бы не сказал, что что-то написано мрамором, будьте готовы немного поэкспериментировать.

person nha    schedule 01.02.2016