4

Lift Web アプリを開発したいのですが、ここに本文があるインデックス ページがあります。

<div id="main" class="lift:surround?with=default&at=content">
  <div> App </div> 
  <div>
    <form method="post" class="lift:DumbForm">
       <table>
            <tr><td> Email:</td> <td><input name="email" type="text"></td></tr>
            <tr><td> Password:</td> <td><input name="pwd" type="password"></td></tr>
            <tr><td> Name:</td> <td><input name="name" type="text"></td></tr>
            <tr><td><input type="submit" value="Sign in"></td> <td><input type="reset" value="Reset"></td></tr>
        </table>
    </form>
  </div> 
</div>

対応するスニペット (ファイル "DumbForm.scala") を使用すると、次のようになります。

package code
package snippet

import net.liftweb._
import http._
import scala.xml.NodeSeq

/**
 * A snippet that grabs the query parameters
 * from the form POST and processes them
 */
object DumbForm {
  def render(in: NodeSeq): NodeSeq = {  
    // use a Scala for-comprehension to evaluate each parameter
    for {
      r <- S.request if r.post_? // make sure it's a post
      name <- S.param("name") // get the name field
    } {
      S.notice("Nom: "+name)
      S.redirectTo("/hello")
    }

    // pass through the HTML if we don't get a post and
    // all the parameters
    in
  }
}

このスニペットの属性「name」を、この名前を取得して表示する別のビュー、HTML ページ (「hello.html」) に渡したいと考えています。

しかし、スニペットからビュー (hello.html) に "name" パラメーターを渡す方法と、ビューでこのパラメーターを取得する方法がわかりません!

この時点で、私の hello.html には次のものがあります。

<body>
<p> Hello ... (you must display the name!)</p>
</body>
4

1 に答える 1

2

やりたいことを実行するには、フォームhello.htmlがマウントされている場所に直接ポイントするだけです。私はそれがhello同じパスにあると仮定しています。

ダムフォーム.html

<div id="main" class="lift:surround?with=default&at=content">
  <div> App </div> 
  <div>
    <form method="post" action="hello">
       <table>
            <tr><td> Email:</td> <td><input name="email" type="text"></td></tr>
            <tr><td> Password:</td> <td><input name="pwd" type="password"></td></tr>
            <tr><td> Name:</td> <td><input name="name" type="text"></td></tr>
            <tr><td><input type="submit" value="Sign in"></td> <td><input type="reset" value="Reset"></td></tr>
        </table>
    </form>
  </div> 
</div>

hello.html

<div data-lift="ShowHelloSnippet">
  <p>Hello <span name="paramname"></span></p>
</div>

スニペット

class ShowHelloSnippet {
  def render = {
    "@paramname" #> S.param("name")
  }
}

それを行うためのより多くのリフト方法は、リフトのSHtml フォーム要素を使用することです:

ダムフォーム.html

<div id="main" class="lift:surround?with=default&at=content">
  <div> App </div> 
  <div>
    <form method="post" data-lift="FormHandlerSnippet">
       <table>
            <tr><td> Email:</td> <td><input name="email" type="text"></td></tr>
            <tr><td> Password:</td> <td><input name="pwd" type="password"></td></tr>
            <tr><td> Name:</td> <td><input name="name" type="text"></td></tr>
            <tr><td><input id="submitbutton" type="submit" value="Sign in"></td> <td><input type="reset" value="Reset"></td></tr>
        </table>
    </form>
  </div> 
</div>

スニペット

class MyFormResponse(
    var email:String="", 
    var password:String="", 
    var name:String ="")

class FormHandlerSnippet {

  def render = {
     val responseForm = new MyFormResponse()
     "@email" #> SHtml.text("", (valueSupplied) => {
        responseForm.email = valueSupplied
     }) &
     "@pwd" #> SHtml.password("", (valueSupplied) => {
        responseForm.password = valueSupplied
     }) &
     "@name" #> SHtml.text("", (valueSupplied) => {
        responseForm.name = valueSupplied
     }) &
     "#submitbutton" #> SHtml.submit("Sign In", () => {
        S.redirectTo("/hello", () => ShowHelloSnippet.myVals(Full(responseForm)))
     })
  }
}

hello.html

<div data-lift="ShowHelloSnippet">
  <p>Hello <span name="paramname"></span></p>
</div>

スニペット

object ShowHelloSnippet {
  object myVals extends RequestVar[Box[MyFormResponse]](Empty)
}

class ShowHelloSnippet {
  def render = "*" #> {
    ShowHelloSnippet.myVals.get.map { r =>
      "@paramname" #> r.name
    }
  }
}

これにより、フォームがオブジェクトに値を設定しShowHelloSnippet、ページがリダイレクトされた後に使用できるように値を設定するステートフル リダイレクトが実行されます。両方の代わりに、Ajax を使用して同じページに値を単純に表示することもできます。

于 2013-04-18T15:34:28.480 に答える