Несколько льда: SelectOneMenu Выбор - PullRequest
0 голосов
/ 29 декабря 2011

Мне хотелось бы знать, как я могу реализовать выбор множественных элементов на льду: selectOneMenu. У меня есть список игрушек, который загружается при инициализации бэк-бина, и в пользовательском интерфейсе у меня есть одна таблица игрушек, где в каждом ряду игрушек есть один столбец selectOneMenu, т.е. игрушечные функции. Моя задача - показать выбранную функцию игрушки в каждом ряду игрушки. До сих пор я мог показывать выбранную функцию в selectOneMenu с помощью следующего кода, но я не знаю, как я могу реализовать различные выборы в разных строках, я имею в виду, что у меня есть только одно свойство selectedToyFunction, которое сопоставлено каждой строке. Мне нужно реализовать что-то вроде java.util.Map<ToyId,ToyFunction>. Но я не знаю, как и где справиться с такой реализацией.

JSPX

<ice:dataTable border="0" value="#{myBean.toys}" var="toy" scrollable="false"   resizable="false">
    <ice:column id="toyDetailRedirect" styleClass="smallColumn">
        <ice:selectOneMenu styleClass="inputCombo" partialSubmit="true" valueChangeListener="#{myBean.redirectToToyFunctionDetail}" value="#{myBean.selectedToyFunction}">
            <f:attribute name="toy" value="#{toy.id}" />
            <f:selectItems value="#{myBean.toyFunctions}" />
        </ice:selectOneMenu>
        <f:facet name="header">
            <ice:outputText value="Details" />
        </f:facet>
    </ice:column>
<ice:dataTable>

BackingBean

public class MyBean 
{    
    //--- Services ---
    private ToyService toyService;       

    //---- UI -----
    private String selectedToyFunction;
    private List<SelectItem> toyFunctions = new ArrayList<SelectItem>();

    //--- properties
    private List<Toy> toys = new ArrayList<Toy>();
    private static final String DEFAULT_SELECTION ="--- Select ---";
    private static final String FUNCTION_A ="A";
    private static final String FUNCTION_B ="B";
    private static final String FUNCTION_C ="C";

    // ---- Logging ----
    private final Logger logger = Logger.getLogger(MyBean.class);


    public MyBean()
    {
        super();
    }

    @PostConstruct
    public void loadToysAndPopulateToysFunctions( )
    {    
        // loadToys
        try
        {
            this.toys = this.toysService.findAllToys();
        }
        catch (Exception e)
        {
            this.logger.warn(e.getMessage());
            this.logger.debug(e);
        }

        if ((this.toys == null) || this.toys.isEmpty())
        {
            /* Out if not toy has been found */
            logger.debug("No Toy has been found !");
            return;
        }
        // Populate default toy  functions
        this.populateToyFunctions();
    }    

    private void populateToyFunctions( )
    {    
        if ((this.toyFunctions == null) || this.toyFunctions.isEmpty())
        {
            this.toyFunctions = new ArrayList<SelectItem>();
            this.toyFunctions.add(new SelectItem(DEFAULT_SELECTION));
            this.toyFunctions.add(new SelectItem(FUNCTION_A));
            this.toyFunctions.add(new SelectItem(FUNCTION_B));
            this.toyFunctions.add(new SelectItem(FUNCTION_C));             
        }
        //Default selection
        this.selectedToyFunction = DEFAULT_SELECTION;    
    }

    public void redirectToToyFunctionDetail(ValueChangeEvent e)
    {
        FacesContext.getCurrentInstance()
                            .getExternalContext()
                            .redirect("/Store/Details.jspx?id=" +e.getNewValue().toString());    
    }

     // ---- Getters & Setters -----

    public List<Toy> getToys( )
    {
        return this.toys;
    }

    public void setToys(List<Toy> toys)
    {
        this.toys = toys;
    }    

    public List<SelectItem> getToyFunctions( )
    {

      return this.toyFunctions;
    }

    public void setToyFunctions(List<SelectItem> toyFunctions)
    {
        this.toyFunctions = toyFunctions;
    }

    public void setSelectedToyFunction(String selectedToyFunction)
    {
        this.selectedToyFunction = selectedToyFunction;
    }

    public String getSelectedToyFunction()
    {
        return this.selectedToyFunction;
    }    
}

1 Ответ

0 голосов
/ 29 декабря 2011

У вас есть 2 варианта:

  1. Просто привяжите значение к текущему итерированному Toy объекту:

    <ice:selectOneMenu value="#{toy.function}">
    

    И присвойте классу Toy соответствующее свойство, если это еще не сделано:

    private String function;
    

    Это естественный подход.

  2. Привязать значение к общему свойству Map bean, как вы сами себе предложили:

    <ice:selectOneMenu value="#{myBean.selectedToyFunctions[toy.id]}">
    

    Убедитесь, что вы подготовили HashMap заранее:

    private Map<Long, String> selectedToyFunctions = new HashMap<Long, String>();
    

    Это только уродливый подход. Вам, вероятно, нужно вручную скопировать / переместить все изменения из / в реальные Toy объекты перед подготовкой / сохранением.

...