Clojurescript 如何在同一事件处理程序中调用re-frame.core/dispatch和re-frame.core/subscribe

Clojurescript 如何在同一事件处理程序中调用re-frame.core/dispatch和re-frame.core/subscribe,clojurescript,reagent,re-frame,Clojurescript,Reagent,Re Frame,例如: (defn starrating [] (reagent/create-class {:reagent-render (fn [] [:div [:input {:type "checkbox" :on-click #(do (re-frame/dispatch [:set-star-rating

例如:

(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 但在此之后,当我们调用subscribe以获取star中的值时,它返回的是以前的值,即false

它将呼吁:

取消选中该复选框时,请求将变为


为什么re-frame.core/subscribe返回以前的设置值?

re-frame有一个数据周期:db->subscriptions->view->dispatch events->db。这是这里最重要的一点

  • 尝试使用app db的订阅在“
    开始”
    中设置复选框值,以便数据从app db流入您的视图
  • 还可以尝试将
    get data from server
    放在事件处理程序中,这样您的视图就不会处理所有的查询机制,而只是调度事件,而不知道响应事件需要发生什么

关于这一点,有很多很好的文档,它们都有一个数据循环:db->subscriptions->view->dispatch events->db。这是这里最重要的一点

  • 尝试使用app db的订阅在“
    开始”
    中设置复选框值,以便数据从app db流入您的视图
  • 还可以尝试将
    get data from server
    放在事件处理程序中,这样您的视图就不会处理所有的查询机制,而只是调度事件,而不知道响应事件需要发生什么

这方面有很多很好的文档

订阅是用于试剂成分的反应

调度是异步的。如果希望同步,请使用dispatch sync

研究如何在保持事件处理程序为纯函数的同时进行ajax调用


阅读文档,re frame有非常好的文档。github中的Readme.md。查看存储库中的示例应用程序以获取示例。

订阅是指与试剂成分一起使用的反应

调度是异步的。如果希望同步,请使用dispatch sync

研究如何在保持事件处理程序为纯函数的同时进行ajax调用

阅读文档,re frame有非常好的文档。github中的Readme.md。请查看存储库中的示例应用程序以获取示例