Clojure: Обработка формы икоты - PullRequest
2 голосов
/ 15 ноября 2011

Я реализую простой раскрывающийся список с помощью икота:

;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.

== 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 Ответ

4 голосов
/ 15 ноября 2011

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

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

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

, чтобы сгенерировать тег выбора со свойством onchange.

...