Lift 2.6:如何附加NodeSeq而不是使用SetHtml()

时间:2014-02-19 09:59:07

标签: lift

我一直使用SetHtml()来交换HTML的块作为ajax调用的返回行程的一部分,即。当我的“编辑项目”ajax调用返回时,我将表示要编辑的“项目”的表单元素的内容交换。

现在我正在尝试将 new 项添加到列表中(以便“Item 2”显示为“Item 1”下的下一个li)。我的html看起来像(这是一个大大简化的版本):

<div data-lift="form.ajax">
    <div data-lift="JsCmdTest">
        <test:submitbutton></test:submitbutton>
        <ul id="targetdiv">
            <li>Item 1</li>
        </ul>
    </div>
</div>

我的Lift代码如下所示

class JsCmdTest extends StatefulSnippet
{
  def dispatch = { case "render" => render }
  def bindStuff(ns: NodeSeq): NodeSeq =
  {
    bind("test", ns,
      "submitbutton" -> SHtml.ajaxButton("Go", ()=> {
          val newLi = Jx(<div>Item 2</div>)
          (ElemById("targetdiv") ~> JsFunc("appendChild", newLi.toJs)).cmd
      })
    )
  }
  def render: (NodeSeq)=>NodeSeq = (ns: NodeSeq) => {
    bindStuff(ns)
  }
}

当我运行它时,会触发ajax调用,并且响应看起来很好,但是我在浏览器控制台中收到以下错误:

The server call succeeded, but the returned Javascript contains an error: NotFoundError: Failed to execute 'appendChild' on 'Node': The new child element is null.

通缉:一种将替换HTML附加到现有&lt; ul&gt;。我觉得我想要追加的方式似乎比可能需要的方式更深奥,但我还没有找到任何其他方法来做到这一点。

提前致谢!

1 个答案:

答案 0 :(得分:1)

  • 您使用非常旧语法进行绑定。如果我没有弄错的话,在lift-2的某处引入了一种新的绑定方式,这是推荐的一种,因为在lift-2.2的某个地方。 (我将在下面编写语法。)

  • JsFunc是一个匿名函数,如def local(a: A): B。您不需要发送匿名函数,您可以直接发送代码。 (见下文。)

  • 所以,我建议这样的事情:

import net.liftweb.http.js.{JsExp, JsCmd, JsCmds}

import net.liftweb.http.js.jquery.JqJE.{JqAppend, JqId}

def render = {
    val appendJs: JsExp = JqId("targetdiv") ~> JqAppend(newLi)
    "#mySubmitButton" #> SHtml.ajaxButton("Go", () => appendJs.cmd)
}

import net.liftweb.http.js.jquery.JqJE.{JqAppend, JqId} def render = { val appendJs: JsExp = JqId("targetdiv") ~> JqAppend(newLi) "#mySubmitButton" #> SHtml.ajaxButton("Go", () => appendJs.cmd) }

您还需要稍微调整一下HTML,例如使用普通的<button>