Jsf 使用PrimeFaces打开多个对话框

Jsf 使用PrimeFaces打开多个对话框,jsf,primefaces,dialog,Jsf,Primefaces,Dialog,使用PrimeFaces,我想打开多个不同的对话框。一开始,一个简单的方法似乎是最好的。这在一定程度上是可行的 我有一个带有记录的数据表,每条记录都可以打开到一个新的对话框。对于每条记录,打开此对话框都可以正常工作。但是,对话框似乎绑定到其调用父对象的id 下面是演示此问题的一个简单示例。考虑下面的 XHTML .< 以及以下支持bean: @ManagedBean 公共类DFDemo{ 私有列表索引=Arrays.asList(1,2,3,4,5); 公共void openDialog(i

使用PrimeFaces,我想打开多个不同的对话框。一开始,一个简单的方法似乎是最好的。这在一定程度上是可行的

我有一个带有记录的
数据表
,每条记录都可以打开到一个新的
对话框
。对于每条记录,打开此对话框都可以正常工作。但是,
对话框
似乎绑定到其调用父对象的id

下面是演示此问题的一个简单示例。考虑下面的<代码> XHTML<代码> .<

以及以下支持bean:

@ManagedBean
公共类DFDemo{
私有列表索引=Arrays.asList(1,2,3,4,5);
公共void openDialog(int索引){
System.out.println(“打开“+索引”对话框);
PrimeFaces.current().dialog().openDynamic(“dfdemo”,null,null);
}
//吸气剂和塞特
}
如果我单击第一个按钮,它将打开一个对话框,并打印
为1打开一个对话框
。类似地,如果我单击第二个按钮,它将打开另一个对话框,并打印
打开一个对话框以显示2

按钮1和2现在无法再打开新对话框。它确实在服务器上调用了
openDynamic()
,但没有打开任何内容。我认为它链接到其父级的原因是,如果您更改排序顺序并将索引5放在顶部,您仍然无法单击第一行(现在是按钮5)

我假设这是因为它链接到
rowIndex
以确保唯一的ID。我可以看到按钮被
onclick='PrimeFaces.ab({s:“indexForm:indexTable:0:openDialogBtn})重新呈现;返回false;'

不过,我打算重新加载此表。此表的内容将不同,但此表的ID不会更改。使其无法打开新对话框

我试图在重新呈现表时附加一些随机id以确保唯一性。但是附加我自己的id会导致组件中断(排序、操作等)

我也无法将常规的
对话框
组件用于特定的区域更新。因为它会破坏现有对话框的生命周期

这似乎是对话框框架的默认行为。与中一样,无法从同一按钮打开多个对话框


是否可以让Dialog框架打开来自同一来源的多个对话框,或者是否有解决此问题的方法?

要让
Dialog框架
发挥作用,您需要注册相应的
ActionListener
。配置的默认
ActionListener
org.primefaces.application.DialogActionListener
。在此
ActionListener
中,源
WidgetVar
和源
ClientId
被放入
FacesContext

在我的例子中,提供一个将随机UUID作为源组件的自定义实现就足够了。这允许从激活
对话框的按钮打开多个对话框

下面的听众:

公共类RandomSourceDialogActionListener实现ActionListener{
私有ActionListener库;
public RandomSourceDialogActionListener(ActionListener基础){
this.base=base;
}
@凌驾
public void processAction(ActionEvent事件)引发AbortProcessingException{
Map attrs=FacesContext.getCurrentInstance().getAttributes();
attrs.put(Constants.DIALOG\u FRAMEWORK.SOURCE\u组件,UUID.randomUUID().toString());
base.processAction(事件);
}
}
faces config.xml
中注册:


my.application.RandomSourceDialogActionListener
org.primefaces.application.DialogNavigationHandler
org.primefaces.application.DialogViewHandler

注意:由于不再知道源组件,因此源组件不再正确处理诸如
dialogReturn
之类的事件。另一方面,原始的
对话框ActionHandler
似乎也不能在
数据表中处理这些事件。但如果只使用一个按钮,则可能会影响您。

如果对话框不是模态对话框,则选中该选项?@Kukeltje默认情况下,该对话框不是模态对话框。多个对话框也可以正常工作,只是不是来自同一个源组件。该按钮对该对话框一无所知。所以如果你不能按下它,听起来好像有什么东西挡住了它和其他类似的按钮。如果这不是情态,那就是奇怪的行为。但是,如果您可以单击它,而服务器端什么也不做,这会使您的描述出错,您可以对此进行调试。你能在没有datatable的情况下用两个按钮复制吗?@Kukeltje I将“不能点击”改为“不打开对话框”。DataTable只是显示它以某种方式链接到激活对话框的按钮。但是,即使只使用一个按钮,就像在PrimeFaces showcase中一样,当多次单击它时,它也不会打开另一个对话框。但是它是否从commandButton调用该方法?如果是这样,那么如果您单步/调试到
PrimeFaces.current().dialog().openDynamic(“dfdemo”,null,null)中会怎么样看到里面发生了什么吗?它停在哪里?遇到检查“已打开”的代码?等等…很好的调查!但要想结束事件等,一切仍然有效?@Kukeltje关闭、最大化、最小化以及来自同一来源和不同来源的多个对话,一切仍如预期一样有效。这似乎比我以前在xhtml中添加随机ID的尝试要干净得多。:)为了避免混淆,我的意思是以ajax方式接收服务器端关闭事件,而不是关闭自身。以及handlerReturn,showMessageInDialog,都来自文档。Cheers@Kukeltje很好的呼叫,这些事件不再被处理。返回事件仍然需要正确的源组件。