我尝试在点击ajax(PrimeFaces)treenodes时使用ui:include
替换页面。默认情况下加载的第一个页面会在所有组件处于活动状态时正确加载,但是当我单击另一个treenode显示另一个页面时,后一个页面加载异常,就像下面的对话框和页面显示一样。
我觉得如果我可以强制页面在nodeSelect
index.jsf
(登录时加载)
<p:layoutUnit position="west" size="270" header="Menu" collapsible="false" resizable="true">
<p:ajaxStatus style="width:16px;height:16px;">
<f:facet name="start">
<h:graphicImage value="../design/ajaxloading.gif"/>
</f:facet>
<f:facet name="complete">
<h:outputText value=""/>
</f:facet>
</p:ajaxStatus>
<h:form id="appsMainControl">
<ui:include src="/ui/appServices.jsf"/>
</h:form>
</p:layoutUnit>
<p:layoutUnit position="center">
<h:form id="centerControl">
<ui:include src="/ui/#{amb.appToGet}.jsf"/>
</h:form>
</p:layoutUnit>
具有侦听器操作的treeview组件。在节点选择上,我希望子页面正确加载
<p:layoutUnit position="west" size="270" header="Menu" collapsible="false" resizable="true">
<p:ajaxStatus style="width:16px;height:16px;">
<f:facet name="start">
<h:graphicImage value="../design/ajaxloading.gif"/>
</f:facet>
<f:facet name="complete">
<h:outputText value=""/>
</f:facet>
</p:ajaxStatus>
<h:form id="appsMainControl">
<ui:include src="/ui/appServices.jsf"/>
</h:form>
</p:layoutUnit>
<p:layoutUnit position="center">
<h:form id="centerControl">
<ui:include src="/ui/#{amb.appToGet}.jsf"/>
</h:form>
</p:layoutUnit>
支持bean:
public void onNodeSelect(NodeSelectEvent event) throws Exception {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
try {
appToGet = appsMainDAO.appToGet(event.getTreeNode().toString());
// ec.redirect("index.jsf");
// System.out.println("Got "+appToGet);
// appSubList = appsMainDAO.appsSubServicesList(appToGet, "Forms");
} catch (Exception ex) {
ex.printStackTrace();
Logger.getLogger(appsMainBean.class.getName()).log(Level.SEVERE, null, ex);
} finally {
}
}
答案 0 :(得分:2)
不要那样做。你正在以错误的方式摩擦JSF,从而陷入了一场重大的灾难。
这里不可能解释整个生命周期,但是 - 直到你真正了解JSF的方式 - 只是假设facelet页面_not_supposed_像HTML页面一样工作。
相反,它们应该像窗口应用程序一样工作,你有一定数量的窗口小部件不会真正出现或消失 - 它们可以放在标签中,它们可以被禁用,但它们从一开始就保持原样。
如果要包含有限数量的内容,最简单的选择是将它们全部包含在内并添加一些render =“#{gui.current =='component1'}”,因此只有其中一个组件可见。