我正在努力解决 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/

10-11 22:54