热实现 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) 重定向到替换“旧”屏幕的新控制器/视图(无需确认)。

所以这是我目前的方法:

    在原始视图中,我有一个 &lt;g:formRemote name="requestForm" url="[controller:'test', action:'testRequest']", update:"dummyRegion"&gt; 和一个被 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 3.2中测试服务中事件的触发?

Grails:在服务器端检测请求中止(ajax,escape,reload)

没有数据库实现的 Grails Security

Grails:运行ajax请求时用户注销

如何在 Grails 或 Java Application 中轻松实现“谁在线”?

使用 Grails 在服务器端获取 JSON 数据