rich:suggestionbox, ajax and pages.xml
romain.dev.easycity.com Dec 15, 2008 6:30 PMHi guys,
I'm using JBoss 4.2.3.GA and Seam 2.1.1.CR1.
I have a problem with rich:suggestionbox calling the init method of its page Session Bean everytime I type a new letter :(
Here is the configuration :
- pages.xml
<page view-id="/index.xhtml" action="#{indexManager.init}"> ... </page>
- index.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions"> <rich:suggestionbox id="#{suggestionBoxId}" for="#{inputTextId}" suggestionAction="#{globalServiceManager.autocompleteCtgDetails}" var="suggestedCtg" requestDelay="100" ignoreDupResponses="true"> <h:column id="#{suggestionBoxId}-col-#{suggestedCtg.id}"> <h:outputText id="#{suggestionBoxId}-output-#{suggestedCtg.id}" value="#{fn:toLowerCase(suggestedCtg.name)}"/> </h:column> </rich:suggestionbox> </ui:composition>
- IndexManagerBean
@Stateful @Scope(SESSION) @Name("indexManager") public class IndexManagerBean implements IndexManagerLocal, Serializable { private boolean isAjaxCall = false; public void init() { System.out.println("> init..."); if (!isAjaxCall) { System.out.println("> init !"); // // Some code // } } /** * WebRemote call. In the case of a AJAX call. Block init method rewrite. */ public void startAjaxCall() { System.out.println("Start >"); isAjaxCall = true; } public void endAjaxCall() { System.out.println("< End"); isAjaxCall = false; } }
I use the isAjaxCall flag to prevent multiple init() code when an ajax request is fired. This is very ugly but it's the only way I found to fix it so far.
It works with a4j but I didn't find a method like actionListener in richfaces :
<a4j:outputPanel id="resultLstCtrl"> <ui:include src="/include/pages/root/index/review-list-navigation-ajax.xhtml" /> </a4j:outputPanel> <a4j:form> <a4j:jsFunction name="refreshResultLstCtrl" reRender="resultLstCtrl" actionListener="#{indexManager.startAjaxCall}" requestDelay="100" ignoreDupResponses="true" oncomplete="index.refreshResultLstCtrlCallbackComplete();"/> </a4j:form>
Is there a better way to fix this ?