defroute не срабатывает при загрузке страницы
У меня есть маршруты приложений, определенные в моем routes.cljs
файл в корне src/cljs/project/routes.cljs
,
(defn app-routes []
(secretary/set-config! :prefix "#")
(defroute
"/" []
(re-frame/dispatch [::events/set-active-panel :welcome-panel])))
; shortened for brevity
Инициализируется в core.cljs
; required [portfolio-app.events :as events]
(defn ^:export init []
(routes/app-routes)
(re-frame/dispatch-sync [::events/initialize-db])
(dev-setup)
(mount-root))
Отправляется ::events/set-active-panel
в events.cljs
(re-frame/reg-event-db
::set-active-panel
(fn-traced [db [_ active-panel]]
(assoc db :active-panel active-panel)))
И имеет :active-panel
подписка в subs.cljs
(re-frame/reg-sub
::active-panel
(fn [db _]
(:active-panel db)))
Я подписываюсь на :active-panel
в моем layout.cljs
; required [portfolio-app.subs :as subs]
(defn panel []
(let [active-panel (re-frame/subscribe [::subs/active-panel])]
[:div
"which panel? " @active-panel]))
@active-panel
является nil
когда я захожу на страницу в первый раз. Панель отправляется только при навигации по страницам. Я знаю, что это сработало изначально. Я не вижу в моих коммитах ничего, что могло бы его сломать.
Как мне получить мой defroutes
стрелять как по загрузке страницы, так и через навигацию по сайту?
2 ответа
Пара предположений на основе доступного кода:
- Ты звонишь
secretary/dispatch
при загрузке страницы или только при последующей навигации? - Ваш
::events/initialize-db
инициализация БД после:active-panel
правильно настроен, что приводит к возврату вашей подпискиnil
?
Я подозреваю, что вы стали жертвой изменения кадра "gotcha", где пространство имен, как events
исключен в процессе компиляции, так как он не указан в (:require ...)
форма. Смотрите документацию Gotcha для более подробной информации.
Чтобы сделать (:require ...)
более явный и сложнее случайно забыть, я всегда заворачиваю все (reg-event-* ...)
вызовы внутри большей функции, которая инициализируется из основной программы:
(ns demo.core
(:require
[demo.events :as events]
[demo.subs :as subs]
...))
(defn app-start
"Initiates the cljs application"
[]
(events/define-all-events!)
(subs/initialize-all)
(configure-browser-routing!)
...)
а потом:
(ns demo.events ...)
(defn define-all-events! []
(reg-event-db ...)
(reg-event-fx ...)
...)
Я использую подобную технику "обернуть в функцию" для маршрутизации секретаря / бухгалтера, а также для определения подписок (т.е. reg-sub
). Например:
(defn configure-browser-routing! []
(println "configure-browser-routing - enter")
(secretary/defroute "/all" []
(println :secretary-route-all)
(browser-nav-handler :all))
(secretary/defroute "/active" []
(println :secretary-route-active)
(browser-nav-handler :active))
(secretary/defroute "/completed" []
(println :secretary-route-completed)
(browser-nav-handler :completed))
(secretary/defroute "/*" []
(println ":secretary-route-all *** default ***")
(browser-nav-handler :all))
(accountant/configure-navigation!
{:nav-handler (fn [path]
(t/spy :accountant--nav-handler--path path)
(secretary/dispatch! path))
:path-exists? (fn [path]
(t/spy :accountant--path-exists?--path path)
(t/spy :accountant--path-exists?--result
(secretary/locate-route path)))})
(println "configure-browser-routing - leave"))