2017-10-09 87 views
1

我跟着這個例子: https://github.com/Day8/re-frame/blob/master/docs/FAQs/PollADatabaseEvery60.md如何在重製幀事件分派事件

這裏是我的間隔處理器

(defonce interval-handler 
    (fn [{:keys [action id frequency event]}] 
    (let [live-intervals (atom {})] 
     (condp = action 
     :start (swap! live-intervals assoc id (js/setInterval #(re-frame/dispatch event) frequency)) 
     :end (do (js/clearInterval (get live-intervals id)) 
       (swap! live-intervals dissoc id)))))) 

(re-frame/reg-fx 
    :interval 
    interval-handler) 

我試圖從另一個分派此事件的時間間隔事件就在這裏:

(re-frame/reg-event-db 
    :start-playing 
    (fn [db _] 
    (re-frame/dispatch [:interval {:action :start 
         :id :some-awesome-id 
         :frequency 1000 
         :event [:tick]}]) 
    (assoc db :is-playing? true 
      :fake (random-active-color db) 
      :real (random-active-color db)))) 

但它說re-frame: no :event handler registered for: :interval

這不可能做到嗎?

回答

2

是一種效果,而不是事件。要調用的效果,你需要包括其作爲一項關鍵的地圖由你的事件處理函數返回 - 不與效果的關鍵發出另一個事件:

(re-frame/reg-event-fx 
    :start-playing 
    (fn [{:keys [db]} _] 
    {:interval {:action :start 
       :id :some-awesome-id 
       :event [:tick]}] 
    :db (assoc db :is-playing? true 
        :fake (random-active-color db) 
        :real (random-active-color db))})) 

上面的事件處理函數會返回一個地圖描述兩個效果:

  • :db - 更新應用程序數據庫到一個新的值(爲:db值提供)

  • - 重製幀會打電話給你的效果處理器(interval-handler),在影響項的值映射

+0

你錯過了'db'作爲第一個參數爲'assoc'。它不會讓我編輯它導致變化太小... – madstap

+0

固定 - 感謝@madstap捕捉它! –