【发布时间】:2013-07-26 13:57:28
【问题描述】:
我正在开发一个 JSF 2.1 项目。我正在使用 primefaces 3.5 组件。 有两个带 viewscoped 的 managedbean,WizardBean 和 CreateInputBean。它们用于向导组件(primefaces)。最后一点首先向导,我单击一个按钮然后打开对话框。对话框中还有向导。这里使用 CreateInputBean 创建域对象的实例。在打开对话框时再次创建实例后,由于 CreateInputBean 是生命,所以有最后一个实例的信息。我想用 ViewScoped 销毁 CreateInputBean 而不转到另一个页面。
我尝试了这些,但它们不起作用。
@ManagedBean(name = "cbean")
@ViewScoped
public class CreateInputBean {
public void addUsage() {
...
FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("#{cbean}");
or
FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("cbean");
}
}
<p:wizard flowListener="#{wizard.onFlowProcess}">
<p:tab id="personal" title="Kullanıcı ile ilgili bilgiler">
...
</p:tab>
<p:tab id="confirm" title="Kullanım Verileri">
<p:panel style="height: 600px;">
<p:dataTable id="liste" value="#{ubean.usages}" var="usage">
...
</p:dataTable>
<p:commandButton value="Ekle" onclick="dlg.show();" type="button" />
</p:panel>
<p:dialog header="Usage Ekleme" widgetVar="dlg" showEffect="fold"
hideEffect="fold" height="600" width="600">
<p:wizard flowListener="#{cbean.onFlowProcess}">
<p:tab title="Servis Tipi">
...
</p:tab>
<p:tab title="Kullanim Tipi">
...
</p:tab>
<p:tab title="İşlem Süresi/Adedi/Miktarı">
<p:panel style="height: 500px; width: 500px;">
<h:panelGrid columns="2">
<p:outputLabel value="Term:" />
<p:inputText value="#{cbean.term}" />
<p:commandButton value="Save"
actionListener="#{cbean.addUsage}" oncomplete="dlg.hide()"
update="liste" />
</h:panelGrid>
</p:panel>
</p:tab>
</p:wizard>
</p:dialog>
</p:tab>
</p:wizard>
【问题讨论】:
-
您的期望有点不切实际。您希望删除对 bean 的引用,而您仍在该 bean 中?这将如何运作?您可能希望的最好结果是回发(导航)到同一视图,以获取同一 bean 的新实例并将前一个实例移出范围。或者使用
@RequestScoped和ELFlash来存储ajax 请求之间的瞬态数据 -
要删除一个引用 CreateInputBean 然后我不在那个 bean 中。现在我在 WizardBean 中。如果我不能销毁 viewscoped 托管 bean,我想在对话框中的向导中获取第一个选项卡。够了。
标签: jsf-2 primefaces destroy view-scope