Apache Wicket - 在ajax请求呈现时推送websocket组件更新

时间:2016-09-15 13:08:38

标签: java ajax websocket wicket

在我们的wicket应用程序中,我们只有一个页面,页面上的每个更改都是使用ajax完成的。但在某些情况下(例如,我们必须打开一个新数据库并初始化JPA EntityManagerFactory等需要一些时间)我们推出一个可自定义的#34;加载弹出窗口" (也是一个wicket组件)通过websocket到客户端。

这很好但昨天我们遇到了一个问题。到目前为止,我们总是在ajax请求的实际呈现开始之前推送弹出窗口(例如,在组件更新意义上的某些导航点击),但昨天我们在组件onConfigure()方法中推送了弹出窗口,以便构建ajax请求已经在运行了。

结果弹出窗口像往常一样立即显示给用户,并且ajax请求中更新的每个组件都被渲染得很好,除了在websocket推送之前渲染的组件的所有domready javascript都丢失了。因此,wicket ajax点击此组件的事件不起作用,因为在响应的<evaluate>标记中,缺少此组件的javascript。

我已经发现的调试方法是,在呈现AbstractAjaxResponse.writeHeaderContribution(Response, Component)时,会向页面添加AjaxHtmlHeaderContainer - 保持IHeaderResponse - 以及推送时通过websocket,生成另一个具有相同固定wicket id("_header_"中定义的HtmlHeaderSectionHandler.HEADER_ID)的HeaderContainer并替换第一个,因此IHeaderResponse在调用render(HeaderItem)之前丢失对于每个HeaderItems,脚本也是如此。

我的问题:有没有办法在ajax请求运行时通过websocket推送组件更新而不会遇到上述问题?或者它可能是一个错误,因为更新的组件标记正确发送到客户端并且只缺少脚本?

编辑:我们目前正在使用Wicket 6.15;将onBeforeRender()更改为onConfigure()

升级到Wicket 6.24后,

Edit2:问题发生了变化:当websocket请求启动时,它仍然会替换已添加到页面的AjaxHtmlHeaderContainer。但是在完成websocket请求之后,ajax请求的标头仍然存在,因此脚本不会丢失。现在整个请求已正确处理,但在方法AbstractAjaxResponse.writeTo(Response, String)的finally语句中,标头不为空,代码尝试用默认标头替换标头。并且存在问题,因为websocket请求不再向页面添加标头,并且替换代码抛出异常,它不能替换尚未添加的组件。

一些附加信息:标题仅在AbstractAjaxResponse.writeHeaderContribution(Response, Component)创建时添加到页面中,但在websocket请求之后,ajax请求的标头不为空,因此不会再添加到页面中。

编辑3:在为Wicket 7.4编写了一个快速入门后,我在Wicket 7.4中尝试了它并且没有出现问题

0 个答案:

没有答案