我正在努力解决ClojureScript中的循环依赖。我试用这种语言已经有一个月了,从来没有使用过真正的语言(Clojure)。
我有一个客户端应用程序,它使用秘书作为路由器。在定义路由时,它们是处理程序函数,将值推送到history-channel,然后由显示特定视图的主应用程序组件使用。因此,我从路由推送的值包含对view函数的引用。此视图函数是呈现给定位置的om组件。在这些视图函数中,我经常需要生成指向应用程序中其他位置的链接、URL。这些URL是从引用它们的同一个处理程序函数生成的。这就是我的循环依赖是如何诞生的。解决这个问题的优雅方法是什么?
router -> views -> router-- 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 "/" {}
(put! history-chan {:token "/"
:view welcome/view}))
(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]]
[myapp.route :as route]))
(defn view [state owner]
(reify
om/IRender
(render [_]
(html [:div [:a {:href (route/some)}]]))))发布于 2014-05-19 15:14:43
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)}]]))))这只是一个可能的解决办法。
发布于 2014-05-19 12:18:47
我有这样的问题,我不使用路由/一些生成urls。
路由器(history.cljs)包括所有视图:
[react.nav :as nav]
[react.loading :as loading]
[react.alerts :as alerts]
........
(def history (History.))
(events/listen
history (.-NAVIGATE goog.history.EventType)
(fn [e]
(secretary/dispatch! (.-token e))))
(defroute "alerts" {:as params}
(nav/switch-to "Alerts")
(alerts/display))视图不需要路由器。链接的工作方式如下:
(def history (History.))
.....
:on-click (fn [e]
(.preventDefault e)
(.setToken history link))}您可以使用所需的任何链接调用setToken:(str "alerts/" sort-key "/" filter-str)
HTH
https://stackoverflow.com/questions/23734893
复制相似问题