首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClojureScript循环依赖

ClojureScript循环依赖
EN

Stack Overflow用户
提问于 2014-05-19 10:02:49
回答 2查看 1.6K关注 0票数 4

我正在努力解决ClojureScript中的循环依赖。我试用这种语言已经有一个月了,从来没有使用过真正的语言(Clojure)。

我有一个客户端应用程序,它使用秘书作为路由器。在定义路由时,它们是处理程序函数,将值推送到history-channel,然后由显示特定视图的主应用程序组件使用。因此,我从路由推送的值包含对view函数的引用。此视图函数是呈现给定位置的om组件。在这些视图函数中,我经常需要生成指向应用程序中其他位置的链接、URL。这些URL是从引用它们的同一个处理程序函数生成的。这就是我的循环依赖是如何诞生的。解决这个问题的优雅方法是什么?

代码语言:javascript
复制
router -> views -> router

-- route.cljs

代码语言:javascript
复制
(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

代码语言:javascript
复制
(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)}]]))))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-19 15:14:43

Clojure中的循环依赖没有简单或优雅的解决方案。很可能你必须重组你的代码。你得把它弄乱才能找到你喜欢的东西。我可能会做这样的事:

- route.cljs

代码语言:javascript
复制
(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

代码语言:javascript
复制
(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)}]]))))

这只是一个可能的解决办法。

票数 2
EN

Stack Overflow用户

发布于 2014-05-19 12:18:47

我有这样的问题,我不使用路由/一些生成urls。

路由器(history.cljs)包括所有视图:

代码语言:javascript
复制
        [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))

视图不需要路由器。链接的工作方式如下:

代码语言:javascript
复制
(def history (History.))
   .....
          :on-click (fn [e]
            (.preventDefault e)
            (.setToken history link))}

您可以使用所需的任何链接调用setToken:(str "alerts/" sort-key "/" filter-str)

HTH

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23734893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档