Фреймворк Scala lift, форма ajax, которая отправляет несколько значений?

Я только начинаю работать с лифтом, и теперь я пытаюсь изменить обычную форму на форму ajax, но метод processEntryAdd никогда не вызывается.

def addUser(xhtml : Group) : NodeSeq = {

    var firstName = ""
    var lastName = ""

    def processEntryAdd() {
        Log.info("processEntryAdd: " + firstName + ", " + lastName)
    }

    SHtml.ajaxForm(
        bind("entry", xhtml,
             "firstName" -> SHtml.text(firstName, 
                 (x) => {
                     Log.info("Setting firstName to " + x); 
                     firstName = x
                 }),
             "lastName" -> SHtml.text(lastName, 
                 (x) => {
                     Log.info("Setting lastName to " + x); 
                     lastName = x
                 }),
             "submit" -> SHtml.submit("Add user", processEntryAdd),
        ))
}

Любая идея, как добиться того, что я пытаюсь сделать, или почему приведенный выше код не работает. Значения двух полей формы отправляются при нажатии кнопки и устанавливаются две локальные переменные firstName и lastName, но функция, связанная с SHtml.submit, не вызывается.

Спасибо!


person ivans    schedule 17.04.2009    source источник


Ответы (3)


Этот вопрос довольно старый, но мне недавно нужно было узнать это самому, и это лучшее решение, которое я когда-либо видел:

ajaxForm(
    bind("entry", xhtml,
         "firstName" -> text(firstName, firstName = _),
         "lastName" -> text(lastName, lastName = _),
         "submit" -> submit("Add user", processEntryAdd _),
    ) ++ hidden(processEntryAdd _)
)

Добавляя обработку к скрытому элементу формы, вы сохраняете кнопку отправки без изменения кода представления.

Вы можете добавить поведение на стороне клиента, заставив processEntryAdd() вернуть JsCmd:

def processEntryAdd() {
    Log.info("processEntryAdd: " + firstName + ", " + lastName)
    JsRaw("alert('process entry added')")
}
person Erlend Halvorsen    schedule 09.09.2009
comment
Спасибо, это похоже на простое решение, скоро попробую. - person ivans; 02.11.2009
comment
В последнем фрагменте должен быть =, чтобы processEntryAdd автоматически не становился Unit. - person Owen; 02.10.2011

В ответ на этот вопрос Дэвид Поллак предложил использовать

«отправить» -> SHtml.hidden («Добавить пользователя», processEntryAdd) ++

в списке рассылки лифтов.

person Alexander Kellett    schedule 22.04.2009
comment
И это работает, но, к сожалению, не решает всей проблемы. Часть головоломки, которую мне все еще не хватает, - это повторная визуализация части страницы после ответа ajax. - person ivans; 23.04.2009

Вот ответ, прокрутите вниз (игнорируйте первый пробел после ‹)

http://www.assembla.com/wiki/show/liftweb/ajaxForm

"отправить" -> (SHtml.hidden(auth) ++ ‹ тип ввода="отправить" значение="Логин"/>)

person ariejdl    schedule 04.01.2011