Как вызывать re-frame.core/dispatch и re-frame.core/subscribe в одном и том же обработчике событий

Например:

(defn starrating []
  (reagent/create-class
   {:reagent-render
    (fn []
      [:div
       [:input {:type "checkbox"
                :on-click #(do (re-frame/dispatch
                                [:set-star-rating
                                 (-> % .-target .-checked)])
                               (get-data-from-server))}]])}))

(defn get-data-from-server []
    (let [star (re-frame/subscribe [:star-rating])]
      (ajax/GET (str "http://192.168.0.117:8080/json/searchhotels.json"
                     "?star=" @star)
                {:response-format :json
                 :keywords? true
                 :handler success-handler
                 :error-handler error-handler})))

В приведенном выше примере флажок не установлен.

Когда флажок установлен, для переменной звезды устанавливается значение true. Но после этого, когда мы вызываем подписку, чтобы получить значение в звезде, она возвращает предыдущее значение, т.е. ложь

Он вызовет: http://192.168.0.117:8080/json/searchhotels.json?star=false

Когда вы снимаете флажок, запрос становится http://192.168.0.117:8080/json/searchhotels.json?star=true

Почему re-frame.core/subscribe возвращает предыдущее установленное значение?


person code-sss    schedule 21.09.2016    source источник


Ответы (2)


re-frame имеет цикл данных: БД -> подписки -> просмотр -> события отправки -> БД. Вот это самое главное понять.

  • Попробуйте установить значение флажка в starrating с подпиской из app-db, чтобы данные перетекали из app-db в ваше представление.
  • Также попробуйте поместить get-data-from-server в обработчик событий, чтобы ваше представление не обрабатывало всю механику запросов, а просто отправляло события, не зная, что должно произойти, чтобы на них отреагировать.

По этому поводу есть куча хорошей документации по адресу https://github.com/Day8/re-frame/tree/master/docs

person Daniel Compton    schedule 21.09.2016

Подписки — это реакции, предназначенные для использования с компонентами реагентов.

Отправка асинхронная. Используйте диспетчерскую синхронизацию, если вы хотите, чтобы она была синхронной.

Посмотрите https://github.com/Day8/re-frame-http-fx для выполнения вызовов ajax, сохраняя при этом обработчики событий в виде чистых функций.

Прочитайте документы, re-frame имеет очень хорошую документацию. Readme.md на гитхабе. Взгляните на примеры приложений в репозитории для примеров.

person fgui    schedule 23.09.2016