ajaxButton在使用Lift Wiring时无法正常工作

时间:2011-04-06 20:58:01

标签: scala lift

我的目标是在初始加载时正常显示文本,但是当按下“编辑”按钮时,文本将变为输入文本框。 HTML是这样的:

<div class="user">
    <div>
        <span>Edit</span><lift:WiredUser.edit />
    </div>
    <div class="details">
        <lift:WiredUser.email />
    </div>
</div>

我的接线类看起来像这样:

class WiredUser {

  val userToWire = (Users.userForDisplay or userDetail.currentValue).get

  private object User {
    val entity = ValueCell(userToWire)
    val edit = ValueCell(false)
    val email = edit.lift(b => entity.lift(_.getEmail.asScala.headOption).get)
  }

  def edit = {
    WiringUI.toNode(User.edit, JqWiringSupport.fade)((mode: Boolean, ns:NodeSeq) => { Wired.editable(
      mode,
      mode,
      (b: Boolean) => ajaxButton(h("Done"), () => {User.edit.set(false); JsCmds.Noop}),
      (b: Boolean) => ajaxButton(h("Edit"),  () => {User.edit.set(true); JsCmds.Noop})
    )})
  }

  def email = WiringUI.toNode(User.email, JqWiringSupport.fade)((email: Option[String], ns: NodeSeq) => {
    Wired.editable(
      email.getOrElse(""),
      User.edit.get,
      (n: String) => ajaxText(n, s => {refresh(setEmail(_, s)); JsCmds.Noop}),
      (n: String) => h(n)
    )
  })
}

object Wired {

   def editable[T](o: T, mode: Boolean, t: (T)=> NodeSeq, f: (T) => NodeSeq) : NodeSeq = {
     mode match {
       case true => t(o)
       case false => f(o)
     }
   }
}

在初始加载时,会显示一个“编辑”按钮。当按下该按钮时,执行具有表单数据“F531904251245BAWYT:true”的ajax调用,但是从不执行附加到ajax调用的函数:()=&gt; {User.edit.set(真); JsCmds.Noop},结果为空:

jQuery(document).ready(function() {
});

对我可能缺少什么的想法?

请注意,我已将此提交到Lift google群组而未作出回应。

我创建了一个工作示例: https://github.com/OleTraveler/scala-wiring-example

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我找到了一些解决方案。我创建了net.liftweb.WiringUI(MyWiringUI)的自定义版本,在那里我更改了以下方法

  def toNode[T](in: NodeSeq, cell: Cell[T], jsEffect: (String, Boolean, JsCmd) => JsCmd)(f: (T, NodeSeq) => NodeSeq): NodeSeq = {
val myElem: Elem = in.find {
  case e: Elem => true
  case _ => false
}.map(_.asInstanceOf[Elem]).getOrElse(<span id={Helpers.nextFuncName}>{in}</span>)

val (elem: Elem, id: String) = Helpers.findOrAddId(myElem)
addJsFunc(cell, (t: T, first: Boolean) => {
  jsEffect(id, first, SetHtml(id, f(t, elem.child)))
})
f(cell.currentValue._1, elem)

}

  def addJsFunc[T](cell: Cell[T], f: (T, Boolean) => JsCmd) {
for {
  cometActor <- S.currentCometActor
} cell.addDependent(cometActor)

val trc = TransientRequestCell(cell)
var lastTime: Long = 0L
var lastValue: T = null.asInstanceOf[T]
for {
  sess <- S.session
} sess.addPostPageJavaScript(() => {
  val (value, ct) = trc.get
  val first = lastTime == 0L
  if (first || (ct > lastTime && value != lastValue)) {
    lastValue = value
    lastTime = ct
    if(first) Noop
    else f(value, first)
  }else{
    Noop
  }
})

}

最重要的变化是:

        if(first) Noop
    else f(value, first)

多数人。

您可以在此处找到https://github.com/mmigacz/lift_wiring

的完整示例

您可以在电梯论坛https://groups.google.com/group/liftweb/browse_thread/thread/932ce4d45ccd6582?hl=pl

上找到有关我的问题的其他一些信息