我一直使用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;。我觉得我想要追加的方式似乎比可能需要的方式更深奥,但我还没有找到任何其他方法来做到这一点。
提前致谢!
答案 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>
。