我有:主页面和对话框上的按钮。
A希望为托管bean(NewDialog.java)提供ViewScope生命周期,执行对话框。 换句话说:在按下按钮的同时重新创建NewDialog bean,并在关闭对话框时销毁。
但NewDialog bean在加载主页时已创建。 如何在按下按钮时强制创建bean?
<ui:composition
<h:form id="mainForm">
<p:commandButton value="New Dialog"
onclick="newDialogVar.show();"/>
</h:form>
<ui:include src="#{viewScopedBean.page}.xhtml" />
</ui:define>
</ui:composition>
包含的页面:
<ui:composition ..
<f:view >
<h:form id="formId"
<p:dialog appendToBody="false"
dynamic="true"
modal="true"
widgetVar="newDialogVar">
<p:commandButton value="Ok"
actionListener="#{newDialog.ok}"/>
</h:form>
</p:dialog>
</f:view>
</ui:composition>
豆:
@ManagedBean
@ViewScoped
public class NewDialog implements Serializable{
@PostConstruct
protected void postConstruct() {
LOG.info("----------------- PostConstruct -------------------");
}
}
我使用:PrimeFaces 3.5和Mojarra 2.1.22
提前致谢!
P.S。 :根据研究我补充说:
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>
到web.xml。
答案 0 :(得分:3)
这是预期的行为。 <ui:include>
在视图构建期间运行,而不是在视图渲染时间期间运行。因此,即使您有条件地呈现其父项之一,它仍将在构建/恢复视图期间评估其src
属性。深入了解“视图构建时间”与“视图渲染时间”的背景说明可以在这个答案中找到:JSTL in JSF2 Facelets... makes sense?
您的具体功能要求尚不清楚,因此我无法详细说明正确的方法,但事实是,如果您想推迟创建bean以显示对话框,则需要寻找替代方法。也许您需要将bean分成两个,一个包含include路径,另一个包含对话框的数据?
答案 1 :(得分:0)
我有一个像你一样的场景显示一个图形内部对话框,这个按钮调用一个methot来设置src到对话框:
<p:commandButton value="Montos" update=":form2:growl, :form2:displaygraf" oncomplete="montosDialog.show()" actionListener="#{serviciosMB.mostrarGraf}" icon="ui-icon-disk"/>
这是对话框(在同一页面中)
<p:dialog id="dialog" header="Estado del monto del contrato" widgetVar="montosDialog" resizable="false">
<p:panel id="displaygraf">
<ui:include src="#{serviciosMB.urlGrafMontos}" />
</p:panel>
</p:dialog>
managedbean serviciosMB:
public void mostrarGraf() throws Exception {
try {
if (this.servicioUtilNew.getContratoUtil().getMontosList().isEmpty()) {
this.urlGrafMontos ="void.xhtml";
JsfUtil.addWarnningMessage("El contrato no tiene montos definidos");
} else {
this.urlGrafMontos ="grafMontosServicios.xhtml";
}
} catch (Exception e) {
JsfUtil.addErrorMessage(e, "Error: addOrdenProdServArr() " + e.getMessage());
}
}
这是grafMontosServicios.xhtml
<h:body>
<p:barChart id="stacked1" value="#{grafMontosServiciosMB.categoryModelChartMontos}" legendPosition="ne" animate="true"
title="Estado del monto del contrato" barMargin="20" style="height:300px; width: 500px"/>
</h:body>
托管bean,其中构建了图形
public CartesianChartModel getCategoryModelChartMontos() {
return categoryModelChartMontos;
}
public void setCategoryModelChartMontos(CartesianChartModel categoryModelChartMontos) {
this.categoryModelChartMontos = categoryModelChartMontos;
}
/**
* Creates a new instance of GrafMontosServiciosMB
*/
public GrafMontosServiciosMB() {
}
@PostConstruct
public void crearTablaMontos() {
try {
...
} catch (Exception e) {
JsfUtil.addErrorMessage(e, "Error: createCategoryModel() " + e.getMessage());
}
}
}