Grails/AJAX: обновление произвольной области на странице с помощью g:submitToRemote

В GSP (Groovy Server Page) я использую <g:submitToRemote update="..."> для обновления <div> после вызова на стороне сервера.

Согласно документации и другим источникам в Интернете, цель <div> может быть размещена произвольно в страница. Однако в своих тестах я обнаружил, что <div> должен окружать тег <g:submitToRemote>.

Если нет, <div> будет обновлено некоторым "случайным" содержимым (т. е. частями формы, которые окружают тег <g:submitToRemote>).

Рассмотрим следующий код GSP:

<html>
<head>
    <g:javascript library="prototype" />
</head>
<body>

<div id="updateMe_NOT_WORKING">${message}</div>

<g:form>
    <div id="updateMe_WORKING">
        <g:submitToRemote value="Click Me"
            action="someAction" update="updateMe_NOT_WORKING" />
    </div>
</g:form>

</body>
</html>

Это в Grails 1.3.4.
Что я упустил? - Спасибо


person robbbert    schedule 24.10.2010    source источник


Ответы (2)


Согласно моим тестам, атрибут action g:submitToRemote не должен не указывать на текущее действие текущего контроллера (поскольку это вставит/дублирует текущее представление в Текущий вид).

Это работает, если вы укажете альтернативное действие в g:submitToRemote, т. е.

<g:submitToRemote value="Click Me"
    action="ajaxAction" update="updateMe" />

Если это действие предоставляет модель, т. е.

def ajaxAction = { [message: 'foo'] }

то должен быть соответствующий ОСП, в котором в данном случае должно быть указано,

$message

В качестве альтернативы действие может использовать метод render — например,

def ajaxAction = { render 'foo' }

Я оставлю этот вопрос открытым на некоторое время на случай, если будут дополнительные ответы, а если их нет, приму этот ответ в качестве решения.

Спасибо

person robbbert    schedule 01.12.2010

Я думаю, проблема в том, что вы не указываете контроллер для своего действия. Попробуйте добавить controller="..." в тег g:submitToRemote. Или хотя бы укажите это в g:form.

Я уверен, что <div> не нужно заворачивать.

person Hoàng Long    schedule 01.12.2010
comment
Спасибо за ответ [+]. - Это заставило меня глубже вникнуть в проблему. - Атрибут controller на самом деле не имеет значения, но это атрибут action (который должен ссылаться на действие, которое не является текущим, плюс некоторые дополнительные условия). - person robbbert; 01.12.2010
comment
Да, это распространенная проблема разработчиков, не знакомых с MVC в Grails. У меня были проблемы с этим в течение довольно долгого времени. - person Hoàng Long; 02.12.2010