2015-11-05 66 views
2

我正在使用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.E​​valuationException: org.primefaces.expression.ComponentNotFoundException:找不到 组件,用于从“j_id1”引用 表达式“contentform:tabView:featureTable”。

虽然在父窗口,我用下面的代码能够更新消息

<p:commandLink id="create" update=":contentform:tabView:message" /> 

如果我们使用PF对话框架,并通过Java代码中打开它,难道就没有父子关系打开窗口?

+2

正确的话,对话框架使用一个'iframe'来显示jsf是一个完全不同的视图。所以像你尝试更新不起作用。我认为这是一个答案,因为它是根据你的实际问题的有效答案,但我把它放开了,因为也许其他人可以尝试为你考虑一个解决方法(也许是将某个ID存储在一个共享的作用域bean中session scoped?),并在父文档中调用一个javascript函数,该函数从父视图调用服务器上的一个方法,*可以*更新您最初想要从对话框框架更新的内容。 – Kukeltje

+0

@Kukeltje谢谢您的回复。 PF团队的一个奇怪的实现我使用ZK框架它也是一个组件框架,它可以很容易地从Modal窗口更新Parent WIndow.PF团队实现它不会帮助任何人通过对话框框架进行一些操作,然后更新后端页面 –

+1

不,这不是奇怪的,在PrimeFaces中,从正常的模态对话框中更新父窗口中的某些东西非常简单,对话框提供了(某些)附加的功能通常的对话不容易做到这一点(例如,提供具有自己的bean和范围的对话框)。如果您不需要此功能,请使用常规对话框。你仍然可以把这些包括在内,以防止重复和更新作品。所以我认为你选择对话框架的原因是错误的。 – Kukeltje

回答

5

使用PrimeFaces对话框架,对话框作为单独的视图加载到HTML 中。

换句话说,对话框有自己的JSF组件树以及它自己的HTML DOM树,它与打开对话框的页面无关。这对于幂等,可加入书签和可导航的对话框特别有用。

但是,您的对话框似乎并非如此。它似乎仍然对其开门红感兴趣,并在结束时依赖它。解决方案相对简单:只要不让对话框对其开启者感兴趣。让开叫者本身对对话关闭事件感兴趣,该对话关闭事件可嵌入对话框开启器按钮中作为dialogReturn事件<p:ajax>。另见Dialog Framework - Data showcase

<h:form> 
    ... 
    <p:commandButton ... action="#{bean.showDialog}"> 
     <p:ajax event="dialogReturn" update=":foo:bar" /> 
    </p:commandButton> 
</h:form> 

另一种方法是使用正常<p:dialog>代替PF对话框架。

<h:form> 
    ... 
    <p:commandButton ... oncomplete="PF('dialog').show()" /> 
</h:form> 
<p:dialog widgetVar="dialog"> 
    <h:form> 
     ... 
     <p:commandButton ... update=":foo:bar" oncomplete="PF('dialog').hide()" /> 
    </h:form> 
</p:dialog> 
+0

我从来没有想过(也没有看过文档:-()为“不打电话给我们,我们打电话给你”的解决方案。 – Kukeltje

+0

@Barusc感谢您的详细回答,但即使添加了这个你上面说\t \t \t \t \t \t \t \t \t \t \t \t''此更新不工作 –

+2

它为我你的问题。在开始的时候,试着从开发者的角度来阐述“没有工作”,而不是从最终用户的角度来看,在浏览器中按F12并跟踪HTTP流量和/或在关键位置放置一个调试断点等。 – BalusC