2011-08-17 90 views
0

我試圖在點擊ajax(PrimeFaces)treenodes時使用ui:include替換頁面。默認加載的第一頁在所有組件都處於活動狀態下正常加載,但當我單擊另一個treenode以顯示另一頁時,後一頁加載異常就像下面顯示對話框和頁面。Ajax樹不加載頁面

我覺得如果我可以強制頁面默認部分重新加載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 { 

    } 

} 

回答

2

不要那樣做。你正在以錯誤的方式磨擦JSF,從而陷入一場重大災難。

在這裏解釋整個生命週期是不可能的,但是 - 直到你真正瞭解JSF的方式 - 只是假設facelet頁面不能像HTML頁面那樣工作。

相反,它們應該像窗口應用程序一樣工作,在窗口應用程序中您有一定數量的窗口小部件,它們不會真正顯示或消失 - 它們可以放在選項卡中,可以禁用,但它們保留在開始。

如果要包含的事物數量有限,最簡單的選擇是將它們全部包含並添加一些渲染=「#{gui.current =='component1'}」,因此只有其中一個組件可見。

+0

謝謝dreger。我想你是對的。儘管同時我覺得在單頁上實現的效果會損害性能,因爲所有頁面將同時加載,並且只會渲染一個頁面。我通過將缺少的html和body標籤添加到UI:組合模板來實現它。我認爲index.jsf會將所有組件重新加載到默認值。謝謝一堆。 – Damilola

+0

@Damilola:好的,它理解你所做的事情(涉及視圖範圍的bean的生命週期,導航等)的含義,然後繼續。順便說一句:相信你的感受並不一定是優化應用程序的最佳方式(儘管它肯定可行)。 – fdreger