2011-04-06 4 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() { 
}); 

내가 누락 된 부분에 대한 의견이 있으십니까?

응답없이 Google 그룹에 제출했습니다.

나는 작업 예를 만들었습니다 : 저도 같은 문제에 직면 한 https://github.com/OleTraveler/scala-wiring-example

답변

2

을 나는 몇 가지 해결책을 찾았습니다. 나는 다음과 같은 방법

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 
    } 
}) 

}

가장 중요한 변화를 변경 net.liftweb.WiringUI (MyWiringUI)의 내 사용자 지정 버전을 만들어 이다 :

 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

감사를 찾을 수 있습니다. 필자는 현재 다른 기능으로 이동 했으므로이 기능을 테스트하기까지 2 ~ 3 주 정도 소요될 것입니다. – OleTraveler

관련 문제