a4j:included rich:dataTable negatively affects a4j:commandButton

旧巷老猫 提交于 2019-12-04 02:03:57

问题


I have a JSF/RichFaces setup with an index.jsp which a4j:includes another piece of code which contains a rich:dataTable.

It initially renders fine, and selecting an item on the index.jsp's dropDown list and clicking the 'Retrieve' a4j:commandButton uses the backing bean's setChosen method to do it's bidding on the back end. The backing bean updates class members whose getters are then called by the model reading elements in a separate file content.jsp which is a4j:included. My updated tabPanel appears.

I can see output in the eclipse console. But when I hit the button again, nothing happens. Nothing in the tomcat 6.0 log and nothing on the console.

EDIT1 Narrowing the problem down to my content.jsp file and not the above index.jsp code, I've found that a rich:dataTable element is the problem. When I remove just this element from the content.jsp, I can reclick on the Retrieve button over and over and it reloads my tab panel. As soon as I put it in, the first click is ok, and then the button will click, but nothing occurs and the button doesn't unclick back out.

The method that provides the rich:dataTable with data shouldn't be suspicious as it works at least the first time, but it only performs some xpath routines and returns a ArrayList<MyDataList>.

Given the edit, can anyone now suggest how to use rich:dataTable so that it doesn't cause any trouble? The element is inside a rich:tabPanel which is inside an h:form but that is all.

Thanks

EDIT2: In response to a commented request below, the following is the full affected code listing as brief as will reproduce the problem. @Damo, please note the a4j:commandButton and rich:dataTable are in different files as the latter is in the jsp file which is a4j:included. Also note the <%@ taglib uri=... references have been removed from both files.

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:included 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>

Thanks very much indeed for looking at this.

EDIT3 As requested, I've tried encapsulating the a4j:include within an h:form. In order for the included content to avoid nesting an h:form, I replaced the enclosing h:form tag in content.jsp with an h:panelGrid. When I reran this the second click on the a4j:commandButton still caused a hang, but I checked with firebug and a POST http://localhost:8888/index.jsf 200 13ms occurred but the response was empty. Does this help?


回答1:


I often experience this when I reRender commandButtons/Links.

Your a4j:form is in effect reRendering itself. Try changing it to something like this:

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

UPDATE: move your h:form to enclose the a4j:include. Pretty sure that it needs a form and of course you can't nest forms.




回答2:


The fix was to install a facelets jar. See here.



来源:https://stackoverflow.com/questions/2237863/a4jincluded-richdatatable-negatively-affects-a4jcommandbutton

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!