从PrimeFaces对话框架的对话框更新父窗口中的组件

Sub*_*shi 4 jsf dialog primefaces jsf-2

我正在使用PF对话框架打开一个对话框.

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);
}
Run Code Online (Sandbox Code Playgroud)

从对话框中我想更新父页面中的组件.所以,我试过下面的代码

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但代码抛出异常:

引起:javax.faces.el.E​​valuationException:org.primefaces.expression.ComponentNotFoundException:找不到从"j_id1"引用的表达式"contentform:tabView:featureTable"的组件.

在父窗口中,我可以使用以下代码更新消息

<p:commandLink id="create" update=":contentform:tabView:message" />
Run Code Online (Sandbox Code Playgroud)

如果我们使用PF Dialog Framework并通过Java代码打开它,是否意味着与开启窗口没有父子关系?

Bal*_*usC 8

使用PrimeFaces对话框架,对话框在HTML中作为单独的视图加载<iframe>.

换句话说,对话框有自己的JSF组件树以及它自己的HTML DOM树,它独立于打开对话框的页面.这对于幂等,可收藏和可导航的对话框特别有用.

但是,您的对话框似乎不是这样的.它似乎仍然对它的开启者感兴趣,并在收盘时依赖它.解决方案相对简单:只是不要让对话框对其开启者感兴趣.让开启者自己对对话框关闭事件感兴趣,该事件可以作为嵌套在对话框开启按钮中的dialogReturn事件使用<p:ajax>.另请参见对话框架 - 数据展示.

<h:form>
    ...
    <p:commandButton ... action="#{bean.showDialog}">
        <p:ajax event="dialogReturn" update=":foo:bar" />
    </p:commandButton>
</h:form>
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用普通<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>
Run Code Online (Sandbox Code Playgroud)

  • 这个对我有用.到目前为止,您提供的信息中未显示您的问题.首先,尝试从开发人员的角度详细阐述"不工作",而不是在最终用户的角度.在浏览器中按F12并跟踪HTTP流量和/或将调试断点放在战略位置等. (2认同)