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

问题描述 投票:0回答:1

情况描述

我想为某个元素制作一个表单模板,但它们必须动态创建。组件中涉及的元数据应该使用作为元数据传递的变量名称。

代码

例如,

看来,

(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)
``
metadata metaprogramming clojurescript template-meta-programming
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]]
© www.soinside.com 2019 - 2024. All rights reserved.