PrimeFaces p: ajax event = "change" не запускается для динамически созданного контента selecOneMenu - PullRequest
1 голос
/ 21 марта 2011

Я хочу генерировать содержимое selecOneMenu, когда пользователь вводит в поле inputText, и реагировать на изменения выбора поля со списком.
Приведенный ниже код обновляет содержимое selecOneMenu по мере ввода пользователем.(Набранные и следующие 9 цифр добавляются в поле со списком. Это просто упрощенный пример кода.)
Когда страница загружена, событие изменения selecOneMenu корректно запускается.Однако после ввода в поле inputValue содержимое selecOneMenu изменяется, и событие выбора не запускается при выборе элемента.

Код работает, если ComboBean имеет область действия сеанса, но я хочу избежать этого решения, есливозможно.

Возможно ли вообще это сделать?
В чем причина, если это невозможно с областью запроса?

PrimeFaces 2.2
Mojarra 2.0.2
GlassFish 3.0.1
Браузер: Chrome, Firefox, IE

combo.xhtml:

<h:head>
    <title>Combo box example</title>
</h:head>

<h:body>
    <h:form>
        <p:panel id="mainPanel">
            <h:panelGroup id="formToSubmit" layout="block">
                <p:messages id="messages" />
                <h:panelGrid columns="2">
                    <h:outputLabel value="Enter a number" />
                    <h:inputText id="inputValue" value="#{comboBean.inputValue}">
                        <p:ajax event="keyup" update="combo"
                            listener="#{comboBean.onKeyUp}" />
                    </h:inputText>

                    <h:outputLabel value="Select a value:" />
                    <h:selectOneMenu id="combo" value="#{comboBean.selectedValue}">
                        <f:selectItem itemLabel="Select a value..."
                            noSelectionOption="true" />
                        <f:selectItems value="#{comboBean.values}" />
                        <p:ajax event="change" update="selectedValue"
                            listener="#{comboBean.valueSelected}" />
                    </h:selectOneMenu>
                    <h:outputLabel value="Selected value:" />
                    <h:inputText id="selectedValue" value="#{comboBean.selectedValue}" />
                </h:panelGrid>
            </h:panelGroup>
        </p:panel>
    </h:form>
</h:body>
</html>

ComboBean.java

package x;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@RequestScoped
public class ComboBean implements Serializable
{
    private static final long serialVersionUID = 1L;
    private String inputValue;
    private String selectedValue;
    private List<String> values;

    @PostConstruct
    void init()
    {
        System.out.println("init");
        setValues(new LinkedList<String>());
        for(int i = 0; i<10 ; i++)
        {
            getValues().add(""+i);
        }
    }

    public void onKeyUp()
    {
        System.out.println("onkeyUp " + getInputValue());
        setValues(new LinkedList<String>());
        if (inputValue != null)
        {
            try 
            {
                int v = Integer.parseInt(inputValue);
                for(int i = 0; i<10 ; i++)
                {
                    getValues().add(""+(v+i));
                }
            } 
            catch (NumberFormatException ne) 
            {
                //doesn't matter
            }
        }
    }

    public void valueSelected()
    {
        System.out.println("valueSelected " + getSelectedValue());
    }

    public void submit()
    {
        System.out.println("submit " + getInputValue());
    }

    public void setInputValue(String inputValue)
    {
        this.inputValue = inputValue;
    }

    public String getInputValue()
    {
        return inputValue;
    }

    public void setSelectedValue(String selectedValue)
    {
        this.selectedValue = selectedValue;
    }

    public String getSelectedValue()
    {
        return selectedValue;
    }

    public void setValues(List<String> values)
    {
        this.values = values;
    }

    public List<String> getValues()
    {
        return values;
    }

}

1 Ответ

3 голосов
/ 21 марта 2011

Проблема в том, что вы сбрасываете свой список при каждом запросе в методе init(). Таким образом, ваш выбранный элемент больше не будет там.

Если вы не хотите использовать SessionScope, возможно, ViewScope будет решением: боб не будет сброшен при перезагрузке той же страницы.

...