Clojure: обработчик форм 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) 

Я думаю, что для того, чтобы делать то, что я хочу, мне нужно, чтобы тег имел атрибут «onchange», который вызывает функцию javascript. Но я не знаю: 1) смогу ли я сделать это, используя раскрывающийся список икоты; 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!"])))))

person kfk    schedule 15.11.2011    source источник


Ответы (1)


hiccup.form-helpers/drop-down не поддерживает напрямую добавление атрибутов к своему элементу select, но гарантирует наличие стандартной карты атрибутов икоты в возвращаемом значении, то есть атрибуты представляют собой карту с индексом 1 (второй элемент ) возвращаемого вектора.

Это означает, что вы можете сделать что-то вроде

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

для создания тега select со свойством onchange.

person Joost Diepenmaat    schedule 15.11.2011
comment
Спасибо. Можно ли отправить параметр тоже? Так что у меня может быть 2 кнопки отправки (одна для onchange и одна для реальной отправки)? - person kfk; 15.11.2011
comment
Вы можете добавить больше javascript или добавить имя + значение к кнопке отправки (они отправляются при нажатии этой кнопки), но в этом случае я не понимаю, почему вы этого хотите. Если вам нужно было нажать кнопку отправки, вы ничего не выбрали, а если вы выбрали что-то, вы не нажали кнопку отправки. Или, может быть, вы хотите вместо этого использовать 2 отдельные формы... - person Joost Diepenmaat; 16.11.2011
comment
Привет, супер спасибо за помощь. Я переписал код выше, думаю, из этого должен быть понятен мой вариант использования. Пожалуйста, стреляйте, если такая реализация на самом деле не clojurian... - person kfk; 16.11.2011