我正在使用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);
}
在对话框中,我想更新父页面中的组件。所以,我试过下面的代码
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:找不到 表达式组件&#34; contentform:tabView:featureTable&#34;引用 来自&#34; j_id1&#34;。
在父窗口中,我可以使用以下代码更新消息
<p:commandLink id="create" update=":contentform:tabView:message" />
如果我们使用PF Dialog Framework并通过Java代码打开它,是否意味着与开启窗口没有父子关系?
答案 0 :(得分:6)
使用PrimeFaces对话框架,对话框将作为单独的视图加载到HTML <iframe>
中。
换句话说,对话框有自己的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>