2

我正在为我的 Web 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 得到错误的值。

在我返回(OKCancel按钮)到父页面并再次启动对话框后,问题就消失了,一切正常。问题似乎只是第一次启动。

为什么第一次启动对话框时会创建两次支持 bean?

4

2 回答 2

1

这是因为第一次打开对话框时发送 AJAX 请求以加载实际内容。这里唯一合理的是使用@ViewScopedbean 来处理这两个请求: first 由 触发commandButton, seconds 由 触发dlgEditWF.show()。当然,如果您删除dynamic="true",将只有一个请求。

于 2013-02-21T12:22:01.353 回答
1

我怀疑这是因为 Primefacesdynamic功能的工作原理。

commandButton 的第一个请求将发送带有 editID 的请求参数以进行加载。发生此请求并收到响应并更新页面元素后,将oncomplete出现显示对话框的 javascript。

一旦显示对话框,就会发生一个完全不同的请求动态加载对话框的内容,除了这次没有 editID 参数。因此,您的 bean@RequestScoped被创建了两次,第二次它不保留 editID 请求参数。

有三种可能的解决方案:

  1. dynamic从对话框中删除属性

  2. 将您的 bean 更改为@ViewScoped@SessionScoped

  3. 将 editID 请求参数更改为@SessionScoped托管 bean 中的 bean 属性。

于 2013-02-21T12:27:19.237 回答