2010-02-10 52 views
1

我有一個帶有index.jsp的JSF/RichFaces設置,其中a4j:include是包含rich:dataTable的另一段代碼。a4j:包括rich:dataTable對a4j有負面影響:commandButton

它最初呈現的罰款,並選擇index.jsp一個項目的下拉列表,然後點擊‘檢索’a4j:commandButton使用支持bean的方法setChosen做的吩咐在後端。支持bean更新類的成員,然後它的獲取者被模型讀取元素在一個單獨的文件content.jsp中調用,該文件是a4j:include d。出現我更新的tabPanel。

我可以在eclipse控制檯中看到輸出。但是當我再次點擊按鈕時,沒有任何反應。在tomcat 6.0日誌中沒有任何東西在控制檯上。

EDIT1 縮小問題到我content.jsp文件,而不是上面的index.jsp代碼,我發現一個rich:dataTable元素的問題。當我從content.jsp中刪除這個元素時,我可以反覆點擊Retrieve按鈕並重新加載我的標籤面板。只要我把它放進去,第一次點擊就可以了,然後按鈕就會點擊,但什麼也沒有發生,按鈕也不會退出。

提供rich:dataTable數據的方法不應該是可疑的,因爲它至少第一次工作,但它只執行一些xpath例程並返回ArrayList<MyDataList>

鑑於編輯,任何人現在可以建議如何使用rich:dataTable,以便它不會造成任何麻煩?元素在rich:tabPanel之內,它位於h:form之內,但僅此而已。

由於

EDIT2: 響應於下方的評論請求,以下是充分的影響代碼列表簡短如將重現該問題。 @Damo,請注意a4j:commandButtonrich:dataTable在不同的文件中,因爲後者在jsp文件中是a4j:include d。 另請注意,<%@ taglib uri=...引用已從兩個文件中刪除。

的index.jsp:

<f:loadBundle basename="messages" var="msg" /> 

<f:view> 
    <rich:page pageTitle="MyTitle" markupType="xhtml"> 
    <h:outputText id="setup" value="#{MyBacking.setup}" /> 
     <rich:toolBar height="35" itemSeparator="line"> 
      <rich:toolBarGroup location="left"> 
       <a4j:form> 
        <a4j:outputPanel id="panel"> 
         <h:outputText style="text-align: center" value="Select " /> 
         <h:selectOneMenu id="nodes" value="#{MyBacking.chosen}"> 
          <f:selectItems value="#{MyBacking.nodes}" /> 
         </h:selectOneMenu> 
         <a4j:commandButton value="Retrieve" 
          reRender="panel,contentPanel,currNode,lastOp" 
          onclick="this.disabled=true" oncomplete="this.disabled=false" /> 
        </a4j:outputPanel> 
       </a4j:form> 
      </rich:toolBarGroup> 
     </rich:toolBar> 

     <rich:panel> 
      <h:panelGroup layout="block" id="contentPanel"> 
       <a4j:include viewId="#{MyBacking.viewId}"> 
        <f:param name="targetIdParam" value="content" /> 
       </a4j:include> 
      </h:panelGroup> 
     </rich:panel> 
    </rich:page> 
</f:view> 

a4j:include d content.jsp

<h:form id="myConfig"> 
    <rich:tabPanel switchType="client" rendered="true"> 
     <rich:tab styleClass="tab" label="Connections"> 
      <rich:dataTable onRowMouseOver="this.style.backgroundColor='#F1F1F1'" 
       onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'" 
       cellpadding="0" cellspacing="0" width="100%" border="0" var="item" 
       value="#{MyBacking.DataList}"> 
       <rich:column style="text-align:center" width="150px"> 
        <h:outputText styleClass="txtBold" 
         value="#{item.info}:#{item.other}" /> 
       </rich:column> 
      </rich:dataTable> 
     </rich:tab> 
    </rich:tabPanel> 
</h:form> 

非常感謝確實在看這個。

EDIT3 按照要求,我已經試過封裝的h:forma4j:include。爲了避免包含的內容嵌套h:表格,我用h:panelGrid替換了content.jsp中的封閉h:form標記。 當我reran這第二次點擊a4j:commandButton仍然造成一個掛起,但我檢查與螢火蟲和POST http://localhost:8888/index.jsf 200 13ms發生,但答覆是空的。這有幫助嗎?

+0

檢查Firefox的JavaScript控制檯和日誌 – Bozho 2010-02-10 15:58:20

+0

發佈您的頁面,以便我們可以看到commandButton *和*數據表 – Damo 2010-02-11 20:05:35

回答

0

解決的辦法是安裝一個facelets jar。見here

4

我經常遇到這種情況,當我reRender commandButtons/Links。

您的a4j:表單實際上是重新生成自身。嘗試改變它是這樣的:

<a4j:form> 
    <a4j:outputPanel id="panel"> 
     <h:outputText style="text-align: center" value="Select " /> 
     <h:selectOneMenu id="mySelect" value="#{MyBacking.chosen}"> 
      <f:selectItems value="#{MyBacking.myList}" /> 
     </h:selectOneMenu> 
    </a4j:outputPanel> 
    <a4j:commandButton value="Retrieve" reRender="panel"/> 
</a4j:form> 

更新:移動你的h:表格以包圍a4j:include。很確定它需要一個表單,當然你不能嵌套表單。

+0

良好的響應,但它不起作用。如果我使用a4j:outputPanel,是否可以忽略對a4j:form的需求? – volvox 2010-02-11 11:10:42

+0

它應該工作 - 再次,檢查您的js控制檯(+1) – Bozho 2010-02-11 12:09:07

+0

有趣。該按鈕開始了一系列支持bean的工作,以完成不同的事情。我已經縮小了它的範圍,以便它可以像上面那樣工作,除非bean更新a4j的元素:包含在上面的頁面中幷包含「rich:dataTable」。我甚至不需要reRender a4j:include來顯示包含的內容。我需要a4j的faces-config.xml導航內容:包含內容嗎?我會問另一個關於這個問題的具體問題。 – volvox 2010-02-11 15:10:33