2011-04-06 36 views
1

我的目標是在初始加載時使文本顯示正常,但是當按下「編輯」按鈕時,文本將更改爲輸入文本框。在HTML是這樣的:ajaxButton在使用電梯接線時不起作用

<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調用的函數不會執行:()=> {User.edit.set(true); JsCmds.Noop}並且結果爲空:

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

有關我可能會丟失什麼的任何想法?

請注意,我已將此郵件提交給Lift組,但沒有回覆。

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

回答

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

+0

謝謝你的職位。現在我已經轉向了另一個功能,所以在我可以測試這個功能前幾個星期。 – OleTraveler 2011-04-15 15:23:26

相關問題