Scala Lift - форма AJAX работает неправильно - PullRequest
1 голос
/ 26 октября 2011

На моей странице есть следующая форма 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» из данных формы, представляющих собой класс case, содержащийся в 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()

        }

    }

}

Конечным результатом должна быть вызываемая функция javascript, которая отправляет данные для отображения на странице.

Когда данные отправляются, хотя кажется, что данные никогда не заходят так далеко, они просто отправляют форму, и тогда ничего не происходит.

Чего мне не хватает? Любая помощь высоко ценится, заранее спасибо:)

1 Ответ

1 голос
/ 26 октября 2011

Для формы Ajax кнопка отправки не сериализуется через Ajax.Вместо этого вы обычно создаете скрытое поле и привязываете обратный вызов process к этому полю.Вы можете сделать это, изменив последнюю строку вашего селектора CSS на:

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

Это добавляет скрытое поле в форму, которое вызывает обратный вызов process при отправке формы.* Больше (но не намного) задокументировано в Simply Lift .

...