【问题标题】:Ajax tree does not load pageAjax 树不加载页面
【发布时间】:2011-08-17 20:08:19
【问题描述】:

我尝试在单击 ajax (PrimeFaces) 树节点时使用 ui:include 交替页面。默认情况下加载的第一个页面在所有组件都处于活动状态的情况下正确加载,但是当我单击另一个树节点以显示另一个页面时,后一个页面加载异常,就像下面显示的对话框和页面手一样。

我觉得我是否可以强制页面在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>

具有侦听器操作的树视图组件。在节点选择上,我希望子页面能够正确加载

<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 {

    }

}

【问题讨论】:

    标签: ajax jsf treeview primefaces


    【解决方案1】:

    不要那样做。您以错误的方式摩擦 JSF,从而导致了一场重大灾难。

    在这里解释整个生命周期是不可能的,但是 - 在您真正了解 JSF 之前 - 假设 facelet 页面_不_supposed_像 HTML 页面一样工作。

    相反,它们应该像窗口应用程序一样工作,其中您有一定数量的小部件不会真正出现或消失 - 它们可以放在选项卡中,它们可以被禁用,但它们从一开始就保持原样.

    如果要包含的东西数量有限,最简单的选择是将它们全部包含并添加一些渲染的="#{gui.current=='component1'}",这样只有一个组件是可见的。

    【讨论】:

    • 感谢德雷格。我想你是对的。尽管同时我觉得在单个页面上实现它会损害性能,因为所有页面将同时加载,并且只有一个要呈现的页面会保留。我通过将缺少的 html 和 body 标记添加到 ui:composition 模板来使其工作。我假设 index.jsf 会将所有组件重新加载为默认值。非常感谢。
    • @Damilola:好吧,如果您了解所做工作的含义(关于视图范围 bean 的生命周期、导航等),那么当然可以继续。顺便说一句:相信自己的感受不一定是优化应用程序的最佳方式(尽管它肯定会奏效)。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多