我正在努力解决 ClojureScript 中的循环依赖。我正在尝试这种语言一个月,从来没有使用过真正的东西(Clojure)。
我有一个使用 secretary 作为路由器的客户端应用程序。当我定义我的路由时,它们是处理函数,将值推送到 history-channel
,然后由显示特定 View 的主应用程序组件使用。因此,我从路由中推送的值包含对 view
函数的引用。这个 View 函数是渲染给定位置的 om 组件。在这些 View 函数中,我经常需要生成应用程序中其他位置的链接、URL。这些 URL 是从引用它们的相同处理函数生成的。我的循环依赖就是这样诞生的。什么是优雅的解决方法?
router -> views -> router
-- 路由.cljs
(ns myapp.route
(:require [secretary.core :as secretary :include-macros true :refer [defroute]]
[myapp.views.welcome :as welcome]
[myapp.views.some :as some]))
(defroute home "/" {}
(put! history-chan {:token "/"
:view welcome/view}))
(defroute some "/some" {}
(put! history-chan {:token "/some"
:view some/view}))
-- 欢迎.cljs
(ns myapp.views.welcome
(:require [om.core :as om :include-macros true]
[sablono.core :as html :refer-macros [html]]
[myapp.route :as route]))
(defn view [state owner]
(reify
om/IRender
(render [_]
(html [:div [:a {:href (route/some)}]]))))
最佳答案
Clojure 中的循环依赖没有简单或优雅的解决方案。很可能你必须重构你的代码。你必须弄乱它才能找到你喜欢的东西。就在我的头顶上,我可能会做这样的事情:
-- route.cljs
(ns myapp.route
(:require [secretary.core :as secretary :include-macros true :refer [defroute]]
[myapp.views.welcome :as welcome]
[myapp.views.some :as some]))
(defroute home "/" {}
(welcome/route))
(defroute some "/some" {}
(put! history-chan {:token "/some"
:view some/view}))
--welcome.cljs
(ns myapp.views.welcome
(:require [om.core :as om :include-macros true]
[sablono.core :as html :refer-macros [html]]))
(declare view)
(defn route []
(put! history-chan {:token "/"
:view view}))
(defn view [state owner]
(reify
om/IRender
(render [_]
(html [:div [:a {:href (route)}]]))))
这只是一种可能的解决方案。
关于ClojureScript 循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23734893/