4

hiccup フレームワークを使用したフォームがあります。次のようになります。

(form-to {:enctype "multipart/form-data"}
  [:post "/add-data"]

  ...

  (submit-button {:class "btn"} "Save")
  (submit-button {:class "btn} "Clone"))

jQuery/javascriptを使用せずに、どの送信ボタンが押されたかを知るにはどうすればよいですか?

の Hiccup のドキュメントを見ましたrequest。ただし、request要素には多くのドキュメントがありません。

4

2 に答える 2

5

完全な例は次のようになります。

(ns myapp.routes.home
  (:use [hiccup core form])
  (:require [compojure.core :refer :all]))

(defn quick-form [& [name message error]]   
  (html
   (form-to {:enctype "multipart/form-data"}
    [:post "/form-out"]
   (text-field "Hello")
   (submit-button {:class "btn" :name "submit"} "Save")
   (submit-button {:class "btn" :name "submit"} "Clone"))))

両方の送信ボタンに同じ名前を使用すると、結果マップで「送信」キーを簡単に検索できることに注意してください。

(defroutes home-routes
 (GET "/form-in" [] (quick-form))
 (POST "/form-out" [:as request] (str (request :multipart-params))))

次のページを開くと、

 http://localhost:3000/form-in

フォームに入力すると、POST ルートの結果は次のようになります。

 {"submit" "Save", "Hello" "hello2"}

ところで、Compojure でのリクエスト マップの構造に関する古い有用な投稿を見つけたので、Clojure コードでの構造解除が容易になります。

于 2015-01-13T01:00:52.203 に答える
2

submit-buttonHTML<input type="text" ...>要素を生成します。それらに「name」および「value」属性を追加できます。

(submit-button {:name "button" :value "save" :class "btn"} "Save")
(submit-button {:name "button" :value "clone" :class "btn"} "Clone")

サーバー側のコードでそれを見つけてください。あなたの場合、 lib-noir が使用されています。しかし、lib-noir の最近のバージョンでは、要求を破壊するためのユーティリティが提供されなくなり、人々は Compojure やベア Ring などの他のライブラリを利用するようになっています。

基本的に必要なもの: - サーバー側アプリがwrap-paramsRing ミドルウェアを使用していることを確認します - 上記の [保存] ボタンがクリックされた場合、サーバー側のハンドラーは[:post "/add-data"]次のようなハッシュ マップを受け取る必要があります。

{:http-method :post
 :uri "/add-data"
 :form-params {"button" "save"
               ;; other form data as key/value pairs
               ;; where: key is input element's "name" attribute and value is input element's "value" attribute
               ...
               }
 ...}

このようなマップで必要な値を見つける方法をご自身で見つけていただければ幸いです。

より詳細な読書:

https://github.com/mmcgrana/ring/wiki/Parameters

于 2015-01-12T04:58:40.457 に答える