Горячая реализация Grails-диалога на стороне сервера, или как выйти из области обновления после вызова AJAX - PullRequest
3 голосов
/ 08 июня 2010

В Grails я использую механизм ниже для реализации того, что я бы назвал условным диалоговым окном, запускаемым на стороне сервера: когда форма отправляется, данные должны сначала обрабатываться контроллером. Исходя из результатов, должно быть либо a) модальное подтверждение «да / нет» перед «старым» экраном или b) перенаправление на новый контроллер / представление, заменяющее «старый» экран (подтверждение не требуется).

Итак, вот мой текущий подход:

  1. В исходном виде у меня есть <g:formRemote name="requestForm" url="[controller:'test', action:'testRequest']", update:"dummyRegion"> и <span id="dummyRegion">, которые скрыты CSS
  2. При отправке формы тестовый контроллер проверяет необходимость подтверждения и, если да, отображает шаблон с диалоговым окном на основе yui, включающим кнопки Да Нет перед старым экраном (что работает нормально, потому что диалоговое окно «исходит от "dummyRegion, не перезаписывая страницу). При нажатии «Да» вызывается другой правый контроллер и действие, и заменяется старый экран. Если нажать «Нет», диалоговое окно отменяется и «старый» экран отображается снова без диалогового окна. Хорошо работает до тех пор, пока здесь.
  3. Когда отправляете форму, и тестовый контроллер видит, что подтверждение НЕ требуется, я обычно перенаправляю прямо на другой контроллер и действие. Но проблема в том, что соответствующее представление этого контроллера не появляется, потому что оно также отображается в невидимом dummyRegion. Поэтому в настоящее время я использую шаблон GSP, включая перенаправление JavaScript, которое я отображаю вместо этого. Однако браузер часто не разрешает перенаправление JavaScript, и я думаю, что это не чистое решение.

Итак (наконец-то ;-) мой вопрос: как мне получить перенаправление контроллера, чтобы соответствующее представление «вырвалось» из моего AJAX dummyRegion, снова заменив весь экран?

Или: у вас есть лучший подход к тому, что я имею в виду? Но учтите, что на стороне клиента я не могу проверить, нужно ли подтверждение, должен быть звонок на сервер! Также я бы хотел избежать обновления всей страницы только для того, чтобы всплыло диалоговое окно подтверждения (что также возможно без AJAX).

Спасибо за любые подсказки!

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Я знаю, что это не «интегрированное» решение, но вы решили сделать это «вручную» с какой-то библиотекой JS по вашему выбору (мой личный выбор - jQuery, но любая другая из установленных библиотек должна сработать?)?Таким образом, вы не будете зависеть ни от какого «региона» обновления, но сможете делать все, что захотите (например, обновлять любой элемент DOM) в обработчике ответа на запрос AJAX.

Просто мысль.Мой личный опыт показывает, что «встроенным» компонентам AJAX / JS в Grails часто не хватает определенной гибкости, и мне всегда было лучше просто делать все в простом jQuery.

0 голосов
/ 08 июня 2010

Звучит как хороший пример использования веб-потоков . Если вы хотите показать форму A, сделать какую-то проверку, а затем либо перейти на NextScreen, либо показать диалог, который позже перенаправляет на NextScreen, тогда вы можете выполнить это с помощью потока:

def shoppingCartFlow = {
    showFormA {
       on("submit") {
             if(needToShowDialog())return
       }.to "showNextScreen"
       on("return").to "showDialog"         
    }
    showDialog {
       on("submit").to "showNextScreen"
    }

    showNextScreen {
       redirect(controller:"nextController", action:"nextAction")
    }
}

Затем вы создаете showDialog.gsp, который всплывает в диалоговом окне.

- EDIT -

Но вы хотите получить ответ Ajax на первую отправку формы, который WebFlow не поддерживает. Этот учебник , однако, научит вас, как настроить ваш веб-поток.

...