Clojure:Hiccup 表单处理程序

kfk*_*kfk 3 clojure form-helpers hiccup drop-down-menu

我正在使用 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))))))
Run Code Online (Sandbox Code Playgroud)

我需要的是在特定表上选择下拉列表时发出发布请求(因为我认为这是唯一的方法,但我愿意接受建议)(以便“get-cols-nms”得到使用选定的表调用)。这样,当在下拉列表中选择数据库的表时,表列会自动显示。

所以,归根结底,重点是让我更好地理解这个函数:

 (drop-down "table" tables-n) 
Run Code Online (Sandbox Code Playgroud)

我认为要执行我想要的操作,我需要标签具有调用 javascript 函数的“onchange”属性。但我不知道:1)我是否可以使用 hiccup form-helper 下拉菜单来做到这一点;2)我如何发布(如果这是唯一的解决方案,也许有一个打嗝的方式?)使用 javascript 发布请求。

==编辑==

按照这个问题的答案,我重新写了上面的代码。应该很简单。因为我认为没有那么多打嗝的例子,我会在这里发布我的代码以供参考。

请记住,此代码仍然存在问题:下拉列表不会停留在所选项目上,但会以默认值返回。这是因为它提交了“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!"])))))
Run Code Online (Sandbox Code Playgroud)

Joo*_*aat 5

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

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

(assoc-in (drop-down ....) [1 :onchange] "this.form.submit()")
Run Code Online (Sandbox Code Playgroud)

生成一个带有 onchange 属性的 select 标签。