2011-10-26 8 views
1

を働いていない私は私のページに次のAJAXフォームを持っている:Scalaのリフト - AJAXフォームが正しく

<form class="lift:form.ajax"> 

    <div class="lift:StreamInput"> 

     <input type="hidden" name="path" /> 
     <input type="hidden" name="user" /> 
     <input type="hidden" name="level" /> 
     <input type="hidden" name="room" /> 

    </div> 

    <input type="submit" value="" /> 

</form> 

入力フィールドの値がDBを呼び出すスニペットによって設定された各。フォームは次のように値を送信するためのものだ提出され

import comet.StreamServer 

object StreamInput { 

    def render = { 

     var path = "" 
     var user = "" 
     var level = "" 
     var room = "" 

     def process(): JsCmd = { 

      val message = comet.StreamItem(user, path, level, room) 
      StreamServer ! message 

     } 


     "name=path" #> SHtml.onSubmit(path = _) & 
     "name=user" #> SHtml.onSubmit(user = _) & 
     "name=level" #> SHtml.onSubmit(level = _) & 
     "name=room" #> SHtml.onSubmit(room = _) 

    } 

} 

そこからあなたが見ることができるように、処理方法を実行することになっていますが、フォームデータから「StreamItem」を構築これStreamServerに含まれ、次にリスナーを更新するStreamServerにオブジェクトを送信する場合のクラスである:

case class StreamItem(user: String, path: String, level: String, room: String) 

class StreamComet extends CometActor with CometListener { 

    private var streams: List[StreamItem] = Nil 

    def registerWith = StreamServer 

    override def lowPriority = { 

     case v: List[StreamItem] => 

      streams = v; 
      reRender(); 

    } 

    def addStreams(): String = { 

     var script = "" 

     streams.foreach{stream => 

      script += """ 

       STREAMMOD.stream_view.add_stream({ 

        path : '""" + stream.path + """', 
        level : '""" + stream.level + """' 

       }) 

      """ 

     } 

     return script 

    } 

    def render = { 

     OnLoad(JsRaw(

      addStreams() 

     ).cmd) 

    } 

} 

object StreamServer extends LiftActor with ListenerManager { 

    private var streams: List[StreamItem] = Nil 

    def createUpdate = streams 

    override def lowPriority = { 

     case StreamItem(user, path, level, room) => { 

      streams :+= StreamItem(user, path, level, room); 
      updateListeners() 

     } 

    } 

} 

最終結果がページに表示するデータを送信whcih呼び出されるjavascript関数であるべきです。

データがそれほど遠くに届かないようだが、フォームを送信しても何も起こらない。

私には何が欠けていますか?どんな助けもありがとうございます。事前に感謝します:)

+0

http://simply.liftweb.net/index-4.8.html#toc-Section-4.8 – Debilski

+0

私は特定の問題を発見しました。フォームからの値がプロセスメソッドに正しく渡されていないようですStreamInput内にあります。何が欠けているのか、間違っているのは、これらの値が失われたということですか? – jhdevuk

+0

私は主な問題は、指定された 'process'メソッドのコールバックがないということです。 – Debilski

答えて

1

Ajaxフォームの場合、送信ボタンはAjaxでシリアル化されません。代わりに、通常、非表示のフィールドを作成し、processコールバックをそのフィールドにバインドします。

"name=room" #> SHtml.onSubmit(room = _) & 
    "name=room *+" #> SHtml.hidden(process) 

これは、フォームが送信されたときprocessコールバックを呼び出しフォームに隠しフィールドを追加します:あなたは、あなたにCSSセレクタの最後の行を変更することでそれを行うことができます。

Simply Liftにはさらに多くの情報が記載されています。

+0

情報をありがとう、私は言及した行を変更しましたが、コンパイラエラーを取得しています "value ++は(scala.xml.NodeSeq)=> scala.xml.NodeSeq" – jhdevuk

+0

Hmのメンバではありません。 onSubmitはNodeSeqの代わりに関数を返します。私は作って編集する必要がありますが、現時点では試してみることはできません。それが動作するかどうか私に教えてください。 – leedm777

+0

これは、少し読んで、stackoverflowの他のすばらしいメンバーからの助けを借りて、すべてのヘルプのためにもう一度感謝しなければならないので、すべてが今働いています:) – jhdevuk

関連する問題