これは実際にはちょっとしたXY 問題かもしれないので、最初に目標が何であるかを説明しようと思います。
Reagentコンポーネントのセットで構成される ClojureScript アプリケーションを構築しています。UI 要素を動的に追加または削除できるユーザー インターフェイスを提供します。これらの UI 要素 (コンポーネント) には特定のタイプがあります。たとえば、Markdown コンポーネントis-a
Text コンポーネント。テキストを追加するオプションがユーザーに表示されるたびに、type+の子孫に一致するすべてのコンポーネントを一覧表示します(この場合は Markdown で、他にもある可能性があります)。
私がコーディングした方法は次のとおりです。各コンポーネントは独自の名前空間にあり、この名前空間には、新しいコンポーネントを返すビルダー関数が含まれています。名前空間のルートでも呼び出します ( derive ::type ::parent)
現在、いくつかの異なる名前空間で、次のようなマップでこれらすべてのコンポーネントを必要とし、列挙しています。
(ns app.components
(:require
[app.gui.markdown :as markdown]
[app.gui.study-list :as study-list]))
(def all
{markdown/t markdown/builder
study-list/t study-list/builder})
は/t
、階層を定義するために使用された名前空間修飾キーワードを参照します。マップを使用してall
、ユーザーに面するメニューのデータを提供します (どのコンポーネントを追加でき、タイプ別にフィルター処理されます)。
ご想像のとおり、これはきれいではありません。階層内のすべてのタイプのこのような (潜在的に) 長いリストを手動で維持する必要があるためです。
むしろ私は何かをしたいの(def all (components-of (descendants ::root)))
ですが、名前で変数を見つける必要があると思うので、これに取り組む方法がわかりません(ClojureScriptではサポートされていません)。
私の質問は、ClojureScript で名前空間 + var のマップまたはリストを (動的に) どのように維持するのですか?