当有人点击数据表上的按钮时,我试图弹出一个窗口。
<h:commandButton
action="#{cacheController.popupDetails}"
immediate="false"
onclick="popup()"
value="View Details"
styleClass="submit">
</h:commandButton>
关联的弹出功能是
function popup() {
window.open('RDDetails.jsf','popupWindow', 'dependent=yes, menubar=no, toolbar=no, height=500, width=400');
}
现在在新的'RDDetails.jsf'文件中,我试图访问相同的managedBean cacheController。但问题是,弹出窗口和JSF生命周期不同步。结果,弹出窗口首先显示空白,当我刷新时,它会提取正确的数据。
无论如何,我可以点击一个按钮,它会在托管bean中进行一些处理,然后打开一个弹出窗口,它会从托管bean中重新处理已处理的数据。
我正在使用JSF 1.1。
答案 0 :(得分:3)
您在这里基本上会触发两个 独立的请求:一个与表单提交相关联,另一个在弹出窗口中打开RDDetails.jsf
。您需要在一个请求中将其合并。您可以通过两种方式实现这一目标:
摆脱onclick
,只需将target="_blank"
添加到<h:form>
,以便将其提交到新窗口/标签页。
通过将return false;
添加到onclick
来阻止默认操作,并在与RDDetails.jsf
关联的bean的构造函数中执行业务逻辑。唯一的(主要)警告是,模型不会使用表单字段进行更新。因此,您需要在JavaScript的帮助下手动将表单字段作为弹出URL的请求参数传递。然后,您可以使用faces-config.xml
中的托管属性条目将GET请求参数注入模型。
第一种方式显然是最简单的,但这并没有给你一个“值得信赖的”弹出/模态对话框。第二种方式有点难度(除非你已经很好地掌握了JavaScript和JSF)。然后我会考虑寻找一个提供即用型弹出组件的组件库。
答案 1 :(得分:0)
参见我的例子:
<h:commandLink action="#{controller.myAction}" onmousedown="document.forms['idform'].target='_blank';">
我正在使用jsf 1.1