1 Reply Latest reply on Mar 24, 2007 11:19 AM by Sergey Smirnov

    reRender problem

    henrik lindberg Apprentice

      Hi,
      In my facelet (below) I am using ajax calls when selecting a row in a data table. When the row is selected I want to update a panel with a value from the selected value.
      At first nothing happened. I then added a <h:outputText> right after the datascroller and I had it output "selectedSpace.spacename" - then it magically worked - I found out however that it was not because of accessing selectedSpace - jut the precense of an h:outputText makes the panel re-render.

      What am I doing wrong here to get this strange effect?
      (The code below behaves as I want, but why do I need the extra h:outputText???)

      <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <ui:composition xmlns="http://www.w3.org/1999/xhtml"
       xmlns:s="http://jboss.com/products/seam/taglib"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
       xmlns:rich="http://richfaces.ajax4jsf.org/rich"
       template="layout/template.xhtml">
      
       <ui:define name="title">Spaces</ui:define>
       <ui:define name="body">
       <div id="wrap-cspaces">
       <img id="spacesHeading" src="/img/heading.png" />
       <a href="FAQ-spaces.seam"><img class="infoButton" id="spacesInfo"
       src="/img/info.button.png" /></a>
       </div>
       <div class="Divider2" id="cspaces-topDivider"/>
      
       <f:view>
       <!-- ADDING NEW SPACE -->
       <div id="addSpaceBox"><h:form id="addSpaceForm">
       <s:validateAll>
       <h:outputLabel for="spaceInput">Wanted Public Space Name:</h:outputLabel>
       <h:inputText
       styleClass="InputField"
       id="spaceInput"
       value="#{userSpaces.spaceInput}"
       required="true"
       maxlength="93" />
       <h:commandButton type="submit" value="Add Space"
       action="#{userSpaces.addSpace}"
       image="/img/create.new.space.grey.btn.png" />
       <h:message for="spaceInput" />
       <h:messages globalOnly="true" />
       </s:validateAll>
       </h:form></div>
       <div class="Divider2" id="cspaces-bottomDivider"/>
      
       <h:outputText
       rendered="#{availableSpaces == null or not (availableSpaces.rowCount > 0)}"
       styleClass="warn"
       value="There are no spaces to display. Add wanted space(s) using the box above." />
       <h:form id="spaceForm">
       <h:dataTable
       id="space_list"
       styleClass="fence"
       value="#{availableSpaces}"
       var="p"
       rendered="#{availableSpaces != null and availableSpaces.rowCount > 0}"
       rowClasses="first,second"
       columnClasses="col1class,col2class"
       first="#{userSpaces.first}"
       rows="#{userSpaces.pageSize}">
       <h:column>
       <f:facet name="header">name</f:facet>
       <a4j:commandLink value="#{p.spaceName}" action="#{userSpaces.select(p)}" reRender="contentList" />
       </h:column>
       <h:column>
       <f:facet name="header">created</f:facet>
       <h:outputText value="#{p.dateAdded}" />
       </h:column>
       </h:dataTable>
       <rich:datascroller
       for="space_list"
       rendered="#{availableSpaces != null and availableSpaces.rowCount > 0}"
       maxPages="9"
       id="paginator"
       renderIfSinglePage="false"
       />
      
      <h:outputText value="" /> <!-- WHY IS THIS NEEDED -->
      <a4j:outputPanel id="contentList" ajaxRendered="true">
       <div id="pos-spacesContent">
       <div id="wrap-spacesContent" class="shadow">
       <div class="shadow2">
       <div id="spacesContentBox" class="shadowed">
       <div id="spacesContentHeader">
       <h:outputText
       value="#{selectedSpace.spaceName}"
       styleClass="spacesContentHeader"
       rendered="#{selectedSpace != null}" />
       <h:outputText
       value="No space selected"
       styleClass="warn spacesContentHeader"
       rendered="#{selectedSpace == null}" />
       </div>
       <div class="Divider2" id="spaces-content-divider" />
       </div>
       </div>
       </div>
       </div>
      </a4j:outputPanel>
       </h:form>
      
       </f:view>
       </ui:define>
      </ui:composition>
      
      

      Any comment or suggestion is welcome.

        • 1. Re: reRender problem
          Sergey Smirnov Master

          I do not see the reason for <h:outputText value="" /> there.

          <a4j:outputPanel id="contentList" ajaxRendered="true">
          As soon as you have ajaxRendered="true" it will already in the list of re-rendered area, so, point to the "contentList" with reRender is unnecessary.
          I thing you can close the form right after the datascroller, as soon as the following outputPanel has no input fields