如何在Lift(Scala)中提交表单后重新呈现页面的一部分

时间:2011-12-13 23:25:03

标签: ajax forms scala lift form-submit

这可能是一个愚蠢的问题,但我无法弄清楚如何做到这一点。 所以我是Scala / Lift的新手,我在http://simply.liftweb.net/index-4.8.html#toc-Section-4.8中阅读了ajax表格章节,但示例中的“RedirectTo”对我来说似乎并不是非常“ajaxian”。通常在通过ajax提交表单的情况下,您只需部分重新呈现相同的页面,对吧? 这就是我想要做的事情,现在我完全失败了。 在通过ajax提交表单后,如何让Lift重新呈现同一页面的一部分?

任何提示都将不胜感激。感谢。

基本上,我看起来像这样:

    <div id="main" class="lift:surround?with=default;at=content">
    <h2>Welcome to your project!</h2>
    <div class="lift:Test">
        <div>
            <form class="lift:form.ajax">
                <fieldset>
                    <label for="name">Name:</label>
                    <input id="name" name="name" type=text>
                    <p></p>
                    <input id="save" type="submit" value="Save">
                </fieldset>
            </form>
        </div>
        <div>
            <span id="theName">Name</span>
        </div>
    </div>
</div>

class Test {

  def render = {
    var name = ""

    def process(): JsCmd = {
      Thread.sleep(500)

      S.notice("Entered name is: %s".format(name))
      Noop
    }

    "#theName " #> "This shall be updated with the name given in the form above" & 
    "#name" #> (SHtml.text(name, name = _) ++ SHtml.hidden(process))
  }
}

提交表单时如何更新“theName”?

2 个答案:

答案 0 :(得分:2)

查看http://lift.la/shtmlidmemoize-simple-ajax-updatingExample Code)。 SHtml.memoizeSHtml.idMemoize会自动缓存HTML代码。不知道为什么在Simply Lift书中这个例子中没有使用它。

答案 1 :(得分:0)

你有两步表格吗?上面的海报是正确的。

将转化保存在RequestVar

在上面的示例中,您要保存的方法是渲染,因此首先记住变换:

 private def renderTest= SHtml.memoize { render }

然后,您可以将此备忘转换保存在RequestVar中(持续1个请求),或者TransientRequestVar,具体取决于您的需求。

 private object testTemplate extends RequestVar(renderTest)

如果要从ajax事件重播转换 - testTemplate.is.applyAgain。

我可能误解了原来的问题,b / c如果你想做一个2步形式,你真的不需要记忆。 memoize是当前表单上的某些内容发生变化,并且您希望通过ajax事件更新它,即在点击或更改时,b / c通常表单不会更新,除非您进行了ajax提交。