Clojure:Hiccup表单处理程序

Clojure:Hiccup表单处理程序,clojure,form-helpers,drop-down-menu,hiccup,Clojure,Form Helpers,Drop Down Menu,Hiccup,我正在使用hiccup实现一个简单的下拉列表: ;DATASET/CREATE (defn get-cols-nms [table] "This function gets the list of columns of a specific table". (do (db/cols-list table))) (defpartial form-dataset [cols-list] (text-field "dataset_nm" "Input here dataset

我正在使用hiccup实现一个简单的下拉列表:

;DATASET/CREATE
(defn get-cols-nms [table] 
      "This function gets the list of columns of a specific table".
  (do (db/cols-list table)))

(defpartial form-dataset [cols-list]
  (text-field "dataset_nm" "Input here dataset name")[:br]
  (drop-down "table" tables-n)
  (submit-button "Refresh")[:br]
  (mapcat #(vector (check-box %) % [:br]) cols-list) 
  )

(defpage "/dataset/create" []
  (common/layout
    (form-to [:post "/dataset/create"]
      (form-dataset (get-cols-nms (first tables-n))))))

(defpage [:post "/dataset/create"] {:as ks}
  (common/layout
    (let [table (ks :table)]
      (form-to [:post "/dataset/create"] 
    (form-dataset (get-cols-nms table))))))
我需要的是在特定表上选择下拉列表时发出post请求(因为我认为这是唯一的方法,但我愿意接受建议)(以便使用所选表调用“get cols nms”)。这样,当在下拉列表中选择数据库的表时,表列将自动显示

因此,归根结底,主要的一点是让我更好地理解这个函数:

 (drop-down "table" tables-n) 
我认为,为了实现我的目的,我需要标记具有一个“onchange”属性,该属性调用javascript函数。但我不知道:1)我是否可以使用hiccup表单帮助器下拉列表来完成此操作;2) 我如何使用javascript发出post请求(如果这是唯一的解决方案,也许有一个打嗝的方法?)

==编辑==

根据这个问题的答案,我重写了上面的代码,应该很简单。因为我认为没有太多的例子出现打嗝,我将在这里发布我的代码以供参考

请记住,此代码仍然存在一个问题:下拉列表不会保留在所选项目上,但会以默认值返回。这是因为它提交了“onchange”。我仍然找不到解决办法,也许有人可以帮我

;DATASET/CREATE
(defn get-cols-nms [table] 
  (do (db/cols-list table)))

(defpartial form-dataset [cols-list]
  (text-field "dataset_nm" "Input here dataset name")[:br]
  (assoc-in (drop-down "table" tables-n) [1 :onclick] "this.form.submit()")[:br]
  [:input {:type "submit" :value "Submit" :name "name"}][:br]
  (mapcat #(vector (check-box %) % [:br]) cols-list) 
  )

(defpage "/dataset/create" []
  (common/layout
    (form-to [:post "/dataset/create"]
      (form-dataset(get-cols-nms (first tables-n))))))

(defpage [:post "/dataset/create"] {:as ks}
  (common/layout
    (prn ks)
    (let [table (ks :table)]
      (form-to [:post "/dataset/create"] 
    (if (= (:name ks) nil)
    (form-dataset (get-cols-nms table))
    [:p "It works!"])))))

hiccup.form-helpers/drop-down不直接支持向其select元素添加属性,但它保证在其返回值中有一个标准的hiccup属性映射,这意味着属性是返回向量的索引1(第二个元素)处的映射

这意味着你可以做类似的事情

(assoc-in (drop-down ....) [1 :onchange] "this.form.submit()")

使用onchange属性生成select标记。

谢谢。是否也可以发送参数?这样我就可以有两个提交“按钮”(一个用于“onchange”,另一个用于真正的提交)?您可以添加更多javascript或向提交按钮添加名称+值(当您按下该按钮时,这些按钮会被发送),但在这种情况下,我不明白您为什么要这样做。如果你必须按提交按钮,你没有选择任何东西,如果你选择了一些东西,你没有按提交按钮。或者,也许你想用两个单独的表格来代替……你好,非常感谢你的帮助。我重写了上面的代码,我认为我的用例应该是清晰的。请,如果这种实现不是真正的clojurian,就开枪吧。。。