2013-02-21 77 views
2

我正在为我的Web UI项目使用PrimeFaces UI库。为什么第一次启动对话框时会创建两次backing bean?

我有一个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> 

这里面相同的文件我有dlgEditWFedit_watchfolder.xhtml包括:

<p:dialog id="editDialog" widgetVar="dlgEditWF" dynamic="true"> 
    <ui:include src="edit/edit_watchfolder.xhtml"/> 
</p:dialog> 

我使用dynamic=="true"以防止点击按钮之前加载edit_watchfolder.xhtml

editWFFormedit_watchfolder.xhtml中的一种形式。

问题是,当我启动第一个对话框时,edit_watchfolder.xhtml支持bean(请求作用域)被创建两次。第一次通过editId(见上面的代码)传递的值是可以的,但第二次它不在那里,所以辅助bean得到错误的值。

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

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

+0

也许这有助于:http://stackoverflow.com/questions/4826377/jsf-backing-bean-constructor-called-multiple-times – 2013-02-21 12:22:02

回答

1

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

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

一旦显示对话框一个完全不同的请求发生动态载荷的对话框中的内容,但这次没有editID参数。您的bean是@RequestScoped,因此它正在创建两次,第二次它不保留editID请求参数。

有三种可能的解决方案:

  1. 从你的对话框

  2. 更改你的bean取出dynamic属性@ViewScoped@SessionScoped

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

+1

谢谢。如果不是'oncomplete',我会使用'onstart'来解决问题。在这种情况下,对话框会立即显示 - 但是为空 - 然后在一两秒钟后,它会使用ajax更新为适当的值。所以,'onclick'的作品,但用户体验是非常糟糕的。 – Danijel 2013-02-21 13:04:59

1

原因是因为第一次打开对话框发送AJAX请求来加载实际内容。这里唯一合理的是使用@ViewScoped bean来处理这两个请求:第一个被commandButton触发,第二个被dlgEditWF.show()触发。当然,如果你删除dynamic="true"只会有一个请求。

相关问题