我正在使用PF对话框框架打开对话框。从PrimeFaces对话框的对话框更新父窗口中的组件
public void addSpecFeatures(){
genericFeatures = new GenericFeatures();
Map<String,Object> options = new HashMap<String, Object>();
options.put("resizable", false);
options.put("draggable", false);
options.put("modal", true);
options.put("widgetVar", "featureDialog");
RequestContext.getCurrentInstance().openDialog("PAGEName", options, null);
}
从对话框中我想更新父页面中的组件。所以,我想下面的代码
public void addFeatures(){
if (null != genericFeatures && null != genericFeatures.getName()) {
if (!genericFeaturesList.contains(genericFeatures)) {
genericFeaturesList.add(genericFeatures);
RequestContext context = RequestContext.getCurrentInstance();
context.update("contentform:tabView:featureTable");
context.closeDialog("PAGEName");
}
}
}
但代码抛出异常如下:
造成的:javax.faces.el.EvaluationException: org.primefaces.expression.ComponentNotFoundException:找不到 组件,用于从“j_id1”引用 表达式“contentform:tabView:featureTable”。
虽然在父窗口,我用下面的代码能够更新消息
<p:commandLink id="create" update=":contentform:tabView:message" />
如果我们使用PF对话框架,并通过Java代码中打开它,难道就没有父子关系打开窗口?
正确的话,对话框架使用一个'iframe'来显示jsf是一个完全不同的视图。所以像你尝试更新不起作用。我认为这是一个答案,因为它是根据你的实际问题的有效答案,但我把它放开了,因为也许其他人可以尝试为你考虑一个解决方法(也许是将某个ID存储在一个共享的作用域bean中session scoped?),并在父文档中调用一个javascript函数,该函数从父视图调用服务器上的一个方法,*可以*更新您最初想要从对话框框架更新的内容。 – Kukeltje
@Kukeltje谢谢您的回复。 PF团队的一个奇怪的实现我使用ZK框架它也是一个组件框架,它可以很容易地从Modal窗口更新Parent WIndow.PF团队实现它不会帮助任何人通过对话框框架进行一些操作,然后更新后端页面 –
不,这不是奇怪的,在PrimeFaces中,从正常的模态对话框中更新父窗口中的某些东西非常简单,对话框提供了(某些)附加的功能通常的对话不容易做到这一点(例如,提供具有自己的bean和范围的对话框)。如果您不需要此功能,请使用常规对话框。你仍然可以把这些包括在内,以防止重复和更新作品。所以我认为你选择对话框架的原因是错误的。 – Kukeltje