2010-02-10 80 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