如何将变量名作为字符串传递给函数?(ClojureScript)

3

情况描述

我希望为一个元素制作一个表单模板,但是它们必须是动态创建的。与组件相关的元数据应该使用传递的变量名作为其元数据。

代码

例如,在视图中:

(ns my.app
  (:require [my.app.templating :as template])

(defn view-component [nOperacaoExtrato]
    [:<>
      (template/temp-form nOperacaoExtrato)])

模板函数,
(ns my.app.templating)

(defn temp-form
  "Template input"
  [dado]
  #_(js/console.log (str "meta-data: " (meta #'dado)))
  (let [nome-var (:name (meta #'dado))]
    [:div.col
     [:label
      {:for (str "form1_" nome-var)}
      "Natureza do Dispendio"]
     [:p
      {:class "form-control",
       :id (str "form1_" nome-var)
       :name (str "form1" nome-var)}
       dado]]))

结果应该是这样的(因为传递的变量是 nOperacaoExtrato):
       [:div.col
        [:label
         {:for "form1_re-fin-n-operacao-extrato-prop"}
            "Nº da Operação no Extrato"]
          [:p
         {:class "form-control",
          :id "form1_re-fin-n-operacao-extrato-prop",
          :name "form1_re-fin-n-operacao-extrato-prop"}
         (h/preencher-str nOperacaoExtrato)]]

问题:

这两个都返回了null

(meta #'data)
(meta data)
``

2
这个回答解决了你的问题吗?如何动态查找Clojure函数的元数据? - Martin Půda
1
特别是:https://dev59.com/kG035IYBdhLWcg3wJcnT#5595649 - Martin Půda
1个回答

2
你可能需要将此函数转换为宏。让我向你展示一下,我的葡萄牙语同胞:

src/cljs/user.cljc

(ns cljs.user)

(defn temp-form-fn
  "Template input"
  [dado nome-var]
  [:div.col
   [:label
    {:for (str "form1_" nome-var)}
    "Natureza do Dispendio"]
   [:p
    {:class "form-control",
     :id (str "form1_" nome-var)
     :name (str "form1" nome-var)}
    dado]])

#?
(:clj
 (defmacro temp-form
   [dado]
   `(temp-form-fn ~dado ~(name dado))))

然后在交互式解释器中:

cljs.user> (require '[cljs.user :refer-macros [temp-form]])
nil
cljs.user> (let [nOperacaoExtrato 1234]
             (temp-form nOperacaoExtrato))
[:div.col
 [:label {:for "form1_nOperacaoExtrato"} "Natureza do Dispendio"]
 [:p
  {:class "form-control",
   :id "form1_nOperacaoExtrato",
   :name "form1nOperacaoExtrato"}
  1234]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接