8.javascriptからsubmitできない

Liftの便利なサーバサイド関数は、javascriptからsubmit()することができません。これは理解しておかないと一度はハマると思いますっ。ここでは原点回帰のサーブレット型Snippetによる解法を説明します。

submitボタンと紐づいてるサーバサイド関数は、click以外のアクションでは、紐づけるキーがLiftに渡らないため(だと思う)、実行することができません。
これでは、クライアントバリデーション(submit前のJavaScriptによる入力値検証)、あるいは、submit前にconfirmしたいときなどは困ってしまいます。

解法としては2つ挙げたいと思います。

1. Ajax Formを駆使してクライアントバリデーションやconfirmを使わないアーキテクチャにする。
2. 普通のServletの考え方に戻る。

1. は「そもそもバリデーションをクライアントサイドに置かない」という考え方になるので、良いことだと思います。
とはいえ、ユーザビリティなどを熟慮した上で、どうしてもjavascriptでsubmitしたい!というときは、2.でいいでしょう。何もLift風をゴリ押しする必要はありません。

Servlet的Snippetの例

class LoginFormClientValidation {
  
  object login extends SessionVar("")
  object password extends SessionVar("")
  
  private def clearSession = {
    login("")
    password("")
  }

  def render : CssSel = if(S.get_?) doGet else doPost
  
  private def doGet : CssSel = {
    "name=login" #> SHtml.text( login.is, login(_) ) &
    "name=password" #> SHtml.password( password.is, password(_)) &
    "type=submit" #> SHtml.button( <span>Join !</span>, ()=>(),
      "onclick"->"""if( confirm("よろしいですか?") ){ submit(); }""" )
  }
  
  private def doPost : Nothing = {
    User.authenticate( login, password ) match {
      case Full(user) =>
        S.notice( "ようこそ %s さん".format(user.nickname) )
        S.redirectTo("mypage")
      case _ =>
        S.error( "ログインできません" )
        S.redirectTo("clientvalidation")
    }
  }
}
  • 入力値の授受以外はServletと同じです。
  • "type=submit" のCssSelはサーバサイドにある意味がないので、HTMLに直接書いてもいいでしょう。
  • 各メソッドの型をあえて明記してみました。

サーブレットがこれだけシンプルに書ける!という観点で見ても、Liftを使ってみる価値はあるのではないでしょうか。


このシリーズ

1.Lift再入門
2.Snippetメソッドとして許される型
3.ログインFORM - S.param使ったら負け
4.サーバーサイドバリデーションとサーバサイド関数
5.行列型の編集FORM
6.Radio、Checkboxが鬼門?
7.Ajax Form
8.javascriptからsubmitできない

動作確認サンプルコード github
Simply Lift(必読)


同じカテゴリのエントリ
1.Lift再入門 / 8.javascriptからsubmitできない / 7.Ajax Form / 6.Radio、Checkboxについて / 5.行列型の編集FORM / 4.サーバーサイドバリデーションとサーバサイド関数 / 3.ログインFORM - S.param使ったら負け / 2.Snippetメソッドとして許される型 / sbt0.12.xで依存jar抽出タスク / scala2.10+lift2.5+NetBeans7.2 / Scalaで入門関数プログラミング / reactive-webを試してみました / Lift2.2M1のテンプレート機能 / Scala Compiler Plugin / View Bound/Context Bound / ScalaZa01参加してきました / Akka Frameworkチュートリアルの次 / Akka Frameworkチュートリアルその2 / Akka Frameworkチュートリアル / LiftでJCaptcha / Url Rewrite Filter / sbt-android-plugin / Android SDK for Scala / 祝Lift2.0リリース / Liftの携帯対応まとめ / Scala2.8への移行 / Lift 2.0-scala280-SNAPSHOT/sbt0.7.1 / Scalaお絵かき環境 - Kojo / Lift+Quartzでバッチ / Scala&Liftを採用した理由 / Liftでdate_select系ヘルパーを作る / LiftでAjax / LiftのSubmitかしこい / lift-mapperのpaginateを使う / snippetをspecする / Lift Mapperを拡張する / LiftのDBをMySQLに / Liftプロジェクト環境を整える / Scala本読み比べてみました / NetBeans6.7&scala / じつはScalaはライトな言語 / Scalaバザ~ル / lift1.0所感 / specsを読む / implicit def / ScalaならNetBeansがサイコー / scala勉強会@東北がスタート / それでも俺はLiftをやるってのか / Scala&Liftセットアップ / ブログリニューアル /
コメント

コメントしてください

closed.