我正在为我的网页UI项目使用PrimeFaces UI库。
我有一个manage_watchfolder.xhtml
页面,其中有一个按钮,此按钮会启动一个对话框:
<p:commandButton value="Add" oncomplete="dlgEditWF.show()" update=":editWFForm">
<f:param value="#{item.value.ID}" name="editId"/>
<h:graphicImage value="./edit.png" />
</p:commandLink>
在同一个文件中,我dlgEditWF
包含edit_watchfolder.xhtml
:
<p:dialog id="editDialog" widgetVar="dlgEditWF" dynamic="true">
<ui:include src="edit/edit_watchfolder.xhtml"/>
</p:dialog>
我使用dynamic=="true"
来阻止在点击按钮之前加载edit_watchfolder.xhtml
。
editWFForm
是edit_watchfolder.xhtml
中的表单。
问题是,当我启动第一次时间的对话框时,edit_watchfolder.xhtml
支持bean(请求作用域)会被创建两次。第一次使用editId
传递的值(参见上面的代码)是可以的,但第二次它没有,所以支持bean得到错误的值。
在我返回(OK
或Cancel
按钮)到父页面并再次启动对话框后,问题就消失了,一切正常。问题似乎只是第一次发布。
为什么在第一次启动对话框时会创建两次辅助bean?
答案 0 :(得分:1)
原因是因为第一次打开对话框时会发送AJAX请求来加载实际内容。这里唯一合理的是使用@ViewScoped
bean来处理两个请求:第一个由commandButton
触发,而秒由dlgEditWF.show()
触发。当然,如果您删除dynamic="true"
,则只会有一个请求。
答案 1 :(得分:1)
我怀疑这是因为Primefaces dynamic
功能如何运作。
commandButton的第一个请求将发送带有editID的request参数进行加载。发出此请求并收到响应并更新页面元素后,会出现显示对话框的oncomplete
javascript。
一旦显示对话框发生了完全不同的请求,动态加载对话框的内容,除非此时没有editID参数。你的bean是@RequestScoped
因此它被创建了两次,第二次它没有保留editID请求参数。
有三种可能的解决方案:
从对话框中删除dynamic
属性
将您的bean更改为@ViewScoped
或@SessionScoped
。
将editID请求参数更改为@SessionScoped
托管bean中的bean属性。