2011-11-15 12 views
2

私はしゃっくりを使用して、簡単なドロップダウンを実施しています:のClojure:ヒカップフォームハンドラ

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

私は、私はJavaScriptを呼び出す「のonchange」属性を持っているタグを必要とやりたいと思います関数。しかし、私は知りません:1)私はこれを行うことができますかっこの形 - ヘルパードロップダウンを使用して、 2)どうすれば問題を解決することができますか(これは唯一の解決策で、多分面倒なやり方がありますか?)javascriptによる投稿要求。

== EDITの==

この質問への答えの後、私は、コードabove.Itは非常に簡単であるべき書き直しました。そこには面倒な例はあまりないと思うので、ここで私のコードを参考にして投稿します。

このコードにはまだ問題があります。ドロップダウンは選択したアイテムには残りませんが、デフォルトでは戻ります。これは、 "onchange"を提出するためです。私はまだ直接そのselect要素に属性を追加することはできませんが、それが保証しない]ドロップダウン/ hiccup.form-ヘルパー

;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!"]))))) 

答えて

4

...多分誰かが助けることができ、そのための解決策を見つけることができませんでした戻り値の標準的なヒカップ属性マップです。つまり、属性は、返されたベクトルのインデックス1(2番目の要素)のマップです。あなたがのonchangeプロパティを持つselectタグを生成する

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

ような何かを行うことができることを意味し

+0

ありがとうございました。パラメータも送信できますか?私は2つの "ボタン"を送信することができます(1つは "onchange"用、もう1つは本物の送信)。 – kfk

+0

JavaScriptを追加したり、送信ボタンに名前+値を追加したりすることができます(ボタンを押すと送信されます)。この場合は、なぜあなたが望むのかわかりません。もしあなたが何かを選択していない、あなたが何かを選択した場合は、提出ボタンを押していない提出ボタンを押していた。または、おそらく2つの別々のフォームを代わりに使用したいと考えています。 –

+0

こんにちは、スーパーヘルプありがとうございます。上記のコードを書き直しました。私の使用例ははっきりしているはずです。その種の実装が実際にクロージャーでない場合は、撮影してください... – kfk