From 5651b4648a791b71787fdb65fc431e5bc44dca39 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Wed, 23 Sep 2020 13:25:11 +0300 Subject: [PATCH] Fix reitit.frontend.easy not correctly removing old event listeners In 0.5.0 rfe start! fn started using first on-navigate callback to get the reference to History instance, so that user on-navigate can use rfe functions that need this reference. History implementations called on-navigate with the instance without event listeners set, so when stop! was called listeners weren't removed. --- .../src/reitit/frontend/history.cljs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/reitit-frontend/src/reitit/frontend/history.cljs b/modules/reitit-frontend/src/reitit/frontend/history.cljs index 0128bcee..84ec5141 100644 --- a/modules/reitit-frontend/src/reitit/frontend/history.cljs +++ b/modules/reitit-frontend/src/reitit/frontend/history.cljs @@ -26,11 +26,14 @@ (let [path (-get-path this)] (when (or (= goog.events.EventType.POPSTATE (.-type e)) (not= @last-fragment path)) - (-on-navigate this path))))] + (-on-navigate this path)))) + ;; rfe start! uses first on-navigate call to store the + ;; instance so it has to see the instance with listeners. + this (assoc this + :popstate-listener (gevents/listen js/window goog.events.EventType.POPSTATE handler false) + :hashchange-listener (gevents/listen js/window goog.events.EventType.HASHCHANGE handler false))] (-on-navigate this (-get-path this)) - (assoc this - :popstate-listener (gevents/listen js/window goog.events.EventType.POPSTATE handler false) - :hashchange-listener (gevents/listen js/window goog.events.EventType.HASHCHANGE handler false)))) + this)) (-stop [this] (gevents/unlistenByKey popstate-listener) (gevents/unlistenByKey hashchange-listener) @@ -115,11 +118,12 @@ (when (.hasFragment uri) (str "#" (.getFragment uri))))] (.pushState js/window.history nil "" path) - (-on-navigate this path))))))] + (-on-navigate this path)))))) + this (assoc this + :listen-key (gevents/listen js/window goog.events.EventType.POPSTATE handler false) + :click-listen-key (gevents/listen js/document goog.events.EventType.CLICK ignore-anchor-click))] (-on-navigate this (-get-path this)) - (assoc this - :listen-key (gevents/listen js/window goog.events.EventType.POPSTATE handler false) - :click-listen-key (gevents/listen js/document goog.events.EventType.CLICK ignore-anchor-click)))) + this)) (-on-navigate [this path] (on-navigate (rf/match-by-path router path) this)) (-stop [this]