1 2 Previous Next 16 Replies Latest reply: Aug 30, 2012 9:48 AM by Brendan Healey RSS

    rich:autocomplete - is it desperately missing itemValue= ?

    Brendan Healey Master

      I'm really having problems getting rich:autocomplete to work with what I consider a typical use case.

      I think part of the problem is that I can't find an example, whether in the showcase or in the practical

      richfaces 2 book, where the value selected by the user is used in any way. Nowhere will you find the

      value= attribute used, or the selected item used in any other way (i.e. in a value change listener).

       

      http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=autocomplete&sample=modes&skin=blueSky

       

      The basic problem is that everything seems to have been thought about, except storing a reference to

      what you've selected. A familiar scenario is using f:selectItems like this:

       

      @Entity

      public class Team {

         @Id

        long id;

        String name;

      }

      ...

      public Team selectedTeam;

      public List<Team> teamList = new ArrayList<>();

      ...

      teamList.add(new Team(1, "Liverpool"));

      teamList.add(new Team(2, "Chelsea"));

      teamList.add(new Team(2, "Manchester United"));

      ...

       

      <h:selectOneMenu value="#{bean.selectedTeam}" converter="genericConverter">

        <f:selectItems value="#{bean.teamList}" var="var" itemLabel="#{var.name}" itemValue="#{var}"/>

      </h:selectOneMenu>

       

      You have a List<Team>, selectItems displays the itemLabel, in this case the team name, and on

      selection you store a reference to the Team object in selectedTeam. If you wanted to you could

      easily store the primary key id instead. All pretty straightforward although a converter is required.

       

      A rich:autocomplete version of the above example could look like this:

       

      rich:autocomplete value="#{bean.selectedTeam}"

                                 mode="cachedAjax"

                                 layout="table"

                                 var="var"

                                 fetchValue="#{var.name}"

                                 autocompleteMethod="#{bean.teamSearch}">

                   <rich:column>

                       <h:outputText value="#{var.name}"/>

                   </rich:column>

                   <a4j:ajax event="selectitem"/>

      </rich:autocomplete

       

      the teamSearch() method returns a List<Team> where the characters typed into autocomplete

      input match in some way the team name. If I type in "Liver" we get one row returned. What is

      supposed to happen is that the value of fetchValue="#{var.name}" replaces any characters typed

      into the input, so "Liverpool". But fetchValue is also used for the value attribute, so we'll get a

      ClassCastException trying to cast a String to a Team (selectedTeam).

       

      If you add a converter, the getAsObject method will be called with fetchValue (the name) as the

      third parameter, which is probably not what you want.

       

      So the problem is that you want to internally reference the object by the primary key, but display

      friendly text to the user, but this seems impossible with the current offering.

       

      Just adding the itemValue attribute would solve the immediate problem, so that there's a difference

      between the text displayed in the input box when you make a selection (fetchValue), and the

      component value (itemValue).

       

      Any thoughts? I've got to say this is totally unusable for me right now, unless I've missed something

      really obvious.

       

      Regards,

      Brendan.

        1 2 Previous Next