defroute не срабатывает при загрузке страницы - PullRequest
1 голос
/ 28 апреля 2019

У меня есть маршруты приложений, определенные в моем файле 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 ]

0 голосов
/ 28 апреля 2019

Я подозреваю, что вы стали жертвой перестановки "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"))
0 голосов
/ 28 апреля 2019

Пара предположений на основе доступного кода:

  • Вы звоните secretary/dispatch при загрузке страницы или только при последующей навигации?
  • Ваша ::events/initialize-db инициализирует БД после правильной установки :active-panel, в результате чего ваша подписка возвращает nil?
...