我有一个“你好,世界!” 使用 Om(从“Chestnut”lein 模板生成)在 ClojureScript 中的应用程序。
目标是使其设置为:
- 该
document.location.hash
值反映了(:route app-state)
向量的变化。 (:route app-state)
矢量反映了值的变化document.location.hash
。(:route app-state)
应用程序在更改时重新呈现。
请注意,我打算将(:route app-state)
向量作为应用程序当前状态的唯一真实来源。更改它的一种机制是用户修改 url。
我应该在哪里以及如何将此行为附加到 Om?
这是我的“你好,世界!” 应用程序。
(ns demo.core
(:require [om.core :as om :include-macros true]
[om.dom :as dom :include-macros true]
[clojure.string :as string]))
(defonce app-state (atom {:text "Hello, World!"
:route ["some" "app" "route"]}))
(defn update-location-hash [app owner]
(reify
om/IRender
(render [_]
(set! js/window.location.hash
(string/join "/" (flatten ["#" (:route app)])))
(dom/div nil ""))))
(om.core/root
update-location-hash
app-state
{:target (. js/document (getElementById "app"))})
(defn main []
(om/root
(fn [app owner]
(reify
om/IRender
(render [_]
(dom/h1 nil (:text app)))))
app-state
{:target (. js/document (getElementById "app"))}))
这成功地写入了document.hash
页面加载。最终这将是一个使用哈希导航来更改视图的单页应用程序。
(render )
这对我来说感觉很脏,因为必须在函数中返回一个 DOM 元素,update-location-hash
除了满足函数的要求之外没有任何目的render
。