2011-08-02 31 views
2

動態包含的頁面不觸發我有一個AdminHome.xhtml網頁,其中有一個動態包括如下:JSF2 AJAX事件

<h:form id="masterform"> 
    <table class="DEFTABLE">        
    <tbody> 
     <tr> 
      <td class="CREATESTYLE">Create  
      <h:selectOneMenu styleClass="SELECTBOX" id="createBox" value="#{adminWindowController.actionSelection}"> 
      <f:ajax event="change" execute=":masterform:workspace" listener="#{adminWindowController.invokeAction}" render=":masterform:workspace :masterform:taskbar createBox"/> 
       <f:selectItem itemValue="NONE" itemLabel="Select one..."/> 
       <f:selectItem itemValue="CREATE_ENTITY_DEFINITION" itemLabel="Entity Definition"/> 
       <f:selectItem itemValue="CREATE_ENTITY_GROUP" itemLabel="Entity Group" /> 
       <f:selectItem itemValue="CREATE_USER" itemLabel="User" /> 
       <f:selectItem itemValue="CREATE_USER_GROUP" itemLabel="User Group" /> 
      </h:selectOneMenu> 
      </td> 
     </tr> 
    </tbody> 
    </table> 

    <h:panelGroup id="workspace"> 
    <table class="DEFTABLE"> 
     <tr> 
      <td class="WSHEIGHT" valign="top"> 
       <ui:include src="#{adminworkspace.workspaceContent}"/> 
      </td> 
     </tr> 
    </table> 
    </h:panelGroup> 
</h:form> 

以上包括將得到頁面名稱動態地在各種AJAX事件觸發AdminHome。 xhtml頁面。

下面是當selectOneMenu用於改變了被加載動態頁面。

<ui:composition> 
    <h:form id="entdefcreateform"> 
    <h:panelGroup id="entdefpanel"> 
     <table> 
     </table> 

     <table cellspacing="0">  
      <tr> 
      <ui:repeat value="#{adminEntityDefnController.entDefTabList}" var="tab"> 
       <td class="#{tab == uIUtil.getRequestMapValue('activetab','General') ? 'TABBUTTONCTIVE' : 'TABBUTTON'} "> 
        <h:commandLink action="#{adminWindowController.TabChange}" style="border: none;"> 
        <f:ajax execute=":masterform:entdefcreateform:entdefpanel" render=":masterform:entdefcreateform:entdefpanel"/> 
         <f:param name="activetab" value="#{tab}"/> 
         <h:outputText value="#{tab}"/> 
        </h:commandLink> 
       </td> 
      </ui:repeat> 
      </tr> 
     </table> 
     <table class="TABCONTENTTABLE"> 
      <tr valign="top">  
       <td class="TABCONTENT"> 
        <ui:include src= "#{adminEntityDefnController.entDefTabTable.get(uIUtil.getRequestMapValue('activetab','General'))}"/> 
       </td> 
      </tr> 
     </table> 
    </h:panelGroup> 
    </h:form> 
</ui:composition> 

回答

1

在JSF2,<ui:include> s的恢復視圖階段,而不是在顯示響應階段期間評估。因此,他們不能動態地工作(了)。從JSF 1.2遷移到2.1後,我遇到了同樣的問題。

1

我把它通過改變bean的操作方法工作。訣竅是返回到觸發ajax請求的相同頁面。我正在使用PrimeFaces 2.2.1,並且菜單以ajax方式觸發。

0

第一個問題,我在你的代碼中看到的是,你不能有2 <形式>:一個嵌套在另一個。 我想這就是爲什麼你的事件不會觸發。 我可能在代碼中遇到同樣的問題!

BTW BalusC你能解釋更多的恰恰是你做的 「關鍵是要返回到觸發Ajax請求相同的頁面。我使用PrimeFaces 2.2.1和菜單大火阿賈克斯方式」 這目前尚不清楚我

0

如你有<ui:include src="#{bean.value}",其中bean是視圖範圍bean。

有可能仍然使用動態頁面加載。對您項目web.xml

  1. 設置javax.faces.PARTIAL_STATE_SAVING爲false:您可以使用這兩個解決方案。它會觸發jsf1.2狀態保存的方式。

  2. <ui:include/>評估值 - 視圖範圍bean的新實例被創建,而不是從上下文服用。結果,src採用的默認值。如果你把bean放在會話範圍內(這不好),或者創建一個只包含頁面路徑字符串的新會話範圍bean(爲了最小化會話大小),它將解決問題。
    這是另一個提示,如果你想重置這個會話bean的值從頁面導航到頁面。其中一種方法是創建僞造方法「reset()」,並在<ui:include/>之前放置<c:if test="#{bean.reset}"></if>,以便爲您的頁面進行此初始化。重置可能看起來像:

    private String lastViewId; 
    
    public boolean isReset() { 
        String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();  
        if (!viewId.equals(lastViewId)) { 
         lastViewId = viewId; 
         //make any clean here 
        } 
        return false; 
    }