Clojure:打嗝形式处理程序

时间:2011-11-15 17:57:22

标签: clojure form-helpers 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))))))

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

所以,最终,重点是让我更好地理解这个功能:

 (drop-down "table" tables-n) 

我认为要做我想做的事情,我需要标签有一个调用javascript函数的“onchange”属性。但我不知道:1)如果我可以使用打嗝形式帮助下拉列表来做到这一点; 2)如何发布(如果这是唯一的解决方案,也许有打嗝方式?)使用javascript发布请求。

== EDIT ==

在回答这个问题之后,我重写了上面的代码。它应该非常简单。我认为没有那么多打嗝的例子,我会在这里发布我的代码以供参考。

请注意,此代码仍有问题:下拉列表不会保留在所选项目上,但会以默认值返回。这是因为它提交了“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!"])))))

1 个答案:

答案 0 :(得分:4)

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

这意味着您可以执行类似

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

生成带有onchange属性的select标记。