热实现 grails 服务器端触发对话框,或如何在 AJAX 调用后突破更新区域
Posted
技术标签:
【中文标题】热实现 grails 服务器端触发对话框,或如何在 AJAX 调用后突破更新区域【英文标题】:Hot to implement grails server-side-triggered dialog, or how to break out of update region after AJAX call 【发布时间】:2011-03-01 06:00:36 【问题描述】:在 grails 中,我使用以下机制来实现我所说的条件服务器端触发对话框:提交表单时,数据必须首先由控制器处理。根据结果,必须有 a) 在“旧”屏幕前的模式是/否确认或 b) 重定向到替换“旧”屏幕的新控制器/视图(无需确认)。
所以这是我目前的方法:
-
在原始视图中,我有一个
<g:formRemote name="requestForm" url="[controller:'test', action:'testRequest']", update:"dummyRegion">
和一个被 CSS 隐藏的
<span id="dummyRegion">
提交表单时,测试控制器检查是否需要确认,如果需要,则呈现一个带有基于 yui 对话框的模板,包括旧屏幕前面的 Yes No 按钮(这工作正常,因为对话框“来自" dummyRegion,不覆盖页面)。当按下“是”时,调用右侧的其他控制器和动作并替换旧屏幕,如果按下“否”,则取消对话框并再次显示“旧”屏幕而不显示对话框。在此之前运行良好。
当提交表单和测试控制器看到不需要确认时,我通常会直接重定向到正确的其他控制器和操作。但问题是该控制器的相应视图没有出现,因为它也在不可见的 dummyRegion 中呈现。因此,我目前使用 GSP 模板,其中包含我呈现的 javascript 重定向。然而,浏览器通常不允许 javascript 重定向,我认为这不是一个干净的解决方案。
所以(最后 ;-) 我的问题是:如何让控制器重定向以使相应的视图“突破”我的 AJAX dummyRegion,再次替换整个屏幕?
或者:对于我的想法,您有更好的方法吗?但请注意,我无法在客户端检查是否需要确认,需要有服务器调用!另外我想避免为了弹出确认对话框而必须刷新整个页面(这在没有 AJAX 的情况下也是可能的)。
感谢任何提示!
【问题讨论】:
【参考方案1】:我知道,这不是“集成”解决方案,但您是否考虑过使用您选择的一些 JS 库“手动”执行此操作(我个人选择 jQuery,但任何其他已建立的库都应该可以解决问题)?这样您就不会依赖任何更新“区域”,而是可以在 AJAX 请求的响应处理程序中做任何您想做的事情(例如更新任何 DOM 元素)。
只是一个想法。我个人的经验是,Grails 中的“内置”AJAX/JS 东西通常缺乏一些灵活性,而且我总是最好用普通的 jQuery 来做所有事情。
【讨论】:
出于简单的原因以及我不熟悉 jQuery 等 JS 库,我想尽可能地坚持使用 grails 功能。但由于我似乎在这方面触及了圣杯的极限,你可能是对的,我需要考虑朝这个方向前进......【参考方案2】:这听起来像是使用web flows 的一个很好的用例。如果您想显示 Form 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
。
--编辑--
但是,您需要对第一个表单提交的 Ajax 响应,而 WebFlow 不支持。不过,tutorial 将教您如何 Ajaxify 您的 Web 流。
【讨论】:
听起来很有趣!但是我能否让 showDialog.gsp 中的对话框以 AJAX 方式在“旧”屏幕前弹出,还是会刷新整个屏幕? WebFlow 不支持开箱即用,但您可以按照我添加的教程使用 webflows 启用 Ajax。 恐怕在这一点上我完全陷入了我原来的问题。如果您在第一次提交时使用 ajaxButton,则必须为此提供一个更新区域,这将适用于潜在的确认以及下一个屏幕,因此再次无法“突破”该区域.还是我在这里错过了什么? 啊,我认为你是对的。然后您可以按照 Daniel 的建议手动滚动一些 Javascript,或者您可以更新整个页面并显示对话框... 好的,我想我会刷新整个页面。感谢您的帮助!以上是关于热实现 grails 服务器端触发对话框,或如何在 AJAX 调用后突破更新区域的主要内容,如果未能解决你的问题,请参考以下文章
Grails:在服务器端检测请求中止(ajax,escape,reload)