PrimeFaces p:ajax event =“change”未在动态创建的selecOneMenu内容上触发

时间:2011-03-21 11:24:27

标签: ajax java-ee primefaces selectonemenu

我想在用户输入inputText字段时生成selecOneMenu内容,并响应组合框选择更改。
以下代码在用户输入时更新selecOneMenu的内容。 (键入的和后面的9个数字将添加到组合框中。这只是一个简化的示例代码。)
加载页面时,selecOneMenu的change事件会被正确触发。 但是,在输入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 个答案:

答案 0 :(得分:3)

问题是您在init()方法中的每个请求期间重置了列表。因此,您选择的元素将不再存在。

如果您不想使用SessionScope,那么ViewScope可能是一个解决方案:如果重新加载相同的页面,则不会重置bean。